是否可以根据r中的行范围和逻辑条件对data.frame进行子集划分?
在base r中,我可以根据行范围对data.frame进行子集划分:是否可以根据r中的行范围和逻辑条件对data.frame进行子集划分?,r,R,在base r中,我可以根据行范围对data.frame进行子集划分: mtcars[1:5,] 或者,我可以根据逻辑条件进行子集划分: mtcars[mtcars$cyl==6,] 但我似乎不能同时做到这两个方面: mtcars[1:5&mtcars$cyl==6,] 警告消息:在1:5和mtcars$cyl==6中:较长的对象长度不是较短对象长度的倍数 还有别的办法吗 用例是用LaF包加载一个巨大的.csv,它允许使用类似于base r的命令进行过滤,但是使用行范围比使用条件加载要快得多,添
mtcars[1:5,]
或者,我可以根据逻辑条件进行子集划分:
mtcars[mtcars$cyl==6,]
但我似乎不能同时做到这两个方面:
mtcars[1:5&mtcars$cyl==6,]
警告消息:在1:5和mtcars$cyl==6中:较长的对象长度不是较短对象长度的倍数
还有别的办法吗
用例是用LaF包加载一个巨大的.csv,它允许使用类似于base r的命令进行过滤,但是使用行范围比使用条件加载要快得多,添加多个条件意味着我有时需要等待一天才能加载数据。您可以使用任何一种方法进行子集设置
如果您以交互方式工作,我将使用
子集
subset(mtcars[1:5,], cyl==6)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
或者存储中间结果
tt <- mtcars[1:5,]
tt[tt$cyl==6,]
rm(tt)
或者存储我在这种情况下建议的1:5
i <- 1:5
mtcars[i[mtcars$cyl[i]==6],]
rm(i)
i这些都是很好的答案,但是对于这个需要读取非常大文件的用例,我无法复制数据。我不确定LaF是否接受子集命令,但会检查它。也许你可以试试我你知道其中哪一个可能更快吗?诀窍是找到一种方法让LaF只在行范围内搜索,而不必计算完整的数据集(30 GB)。我担心nrow()可能会迫使它这样做。是的,在第一个选项中,我们正在生成从1到nrow
的序列,这可能没有效率。您可以使用intersect
方法。更好的是mtcars[intersect(1:5,即mtcars$cyl[1:5]==6)),]
tt <- mtcars[1:5,]
tt[tt$cyl==6,]
rm(tt)
mtcars[(1:5)[mtcars$cyl[1:5]==6],]
#mtcars[1:5,][mtcars$cyl[1:5]==6,] #Alternative
#mtcars[1:5,][mtcars[1:5,]$cyl==6,] #Alternative
i <- 1:5
mtcars[i[mtcars$cyl[i]==6],]
rm(i)