在基 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 的命令进行过滤,但是使用行范围比使用条件加载内容要快得多,并且添加多个条件意味着我有时会等待一天的数据加载。
如果您以交互方式工作,我会使用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
Run Code Online (Sandbox Code Playgroud)
或者存储中间结果。
tt <- mtcars[1:5,]
tt[tt$cyl==6,]
rm(tt)
Run Code Online (Sandbox Code Playgroud)
或者,您可以链接您的两个条件。
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
Run Code Online (Sandbox Code Playgroud)
或存储1:5我在这种情况下推荐的内容。
i <- 1:5
mtcars[i[mtcars$cyl[i]==6],]
rm(i)
Run Code Online (Sandbox Code Playgroud)