在 base r 中,我可以根据行范围对 data.frame 进行子集化:
mtcars[1:5,]
或者我可以根据逻辑条件进行子集:
mtcars[mtcars$cyl==6,]
但我似乎无法做到这两点:
mtcars[1:5 & mtcars$cyl==6,]
Warning message: In 1:5 & mtcars$cyl == 6 : longer object length is not a multiple of shorter object length
还有其他方法吗?
用例是用 LaF 包加载一个巨大的 .csv,它允许使用类似于 base r 的命令进行过滤,但是使用行范围比使用条件加载东西要快得多,并且添加多个条件意味着我有时需要等待一天才能加载数据。
如果您以交互方式工作,我会使用 subset
。
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)
或者,您可以链接两个条件。
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
或存储 1:5
我在这种情况下推荐的内容。
i <- 1:5
mtcars[i[mtcars$cyl[i]==6],]
rm(i)