我想保持第1个工作在组或mpg>= 10。有没有办法,我们可以不创建一组变量从。n ?
我正在寻找使用数据的解决方案。表方案。我在下面尝试了,但是它正在等待j,所以得到警告。
library(data.table)
x <- mtcars
setDT(x)
x[.N==1 | mpg >= 10,,by=carb]
试试这个
使用mpg >= 50
,我们应该得到每个carb
的一行:
x[ rowid(carb) == 1 | mpg >= 50,]
# mpg cyl disp hp drat wt qsec vs am gear carb
# <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
# 1: 21.0 6 160.0 110 3.90 2.62 16.46 0 1 4 4
# 2: 22.8 4 108.0 93 3.85 2.32 18.61 1 1 4 1
# 3: 18.7 8 360.0 175 3.15 3.44 17.02 0 0 3 2
# 4: 16.4 8 275.8 180 3.07 4.07 17.40 0 0 3 3
# 5: 19.7 6 145.0 175 3.62 2.77 15.50 0 1 5 6
# 6: 15.0 8 301.0 335 3.54 3.57 14.60 0 1 5 8
使用mpg >= 30
(自all(mpg > 10)
以来),我们应该得到上述所有内容加上更多:
x[ rowid(carb) == 1 | mpg >= 30,]
# mpg cyl disp hp drat wt qsec vs am gear carb
# <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
# 1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# 2: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# 3: 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# 4: 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
# 5: 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 6: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# 7: 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 8: 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
# 9: 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
# 10: 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
的另一种选择,如果你需要更多的分组变量:
x[, .SD[seq_len(.N) == 1L | mpg >= 30,], by = carb]
虽然我被告知rowid(...)
比seq_len(.N)
更有效。
我们可以使用.I
来获取子集
x[x[, .I[seq_len(.N) == 1|mpg >= 30], by = carb]$V1]
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3: 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
4: 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
5: 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
6: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
7: 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
8: 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
9: 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
10: 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8