data.table - 保留每组第一行或根据条件
data.table - keep first row per group OR based on condition
我想将 1st obs 保留在 group OR mpg >= 10 中。有什么方法可以不从 .N 创建变量分组吗?
我正在寻找使用 data.table 包的解决方案。我在下面尝试过,但它期待 j 所以得到警告。
library(data.table)
x <- mtcars
setDT(x)
x[.N==1 | mpg >= 10,,by=carb]
我们可以使用.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
试试这个。
使用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)
更有效率。
我想将 1st obs 保留在 group OR mpg >= 10 中。有什么方法可以不从 .N 创建变量分组吗?
我正在寻找使用 data.table 包的解决方案。我在下面尝试过,但它期待 j 所以得到警告。
library(data.table)
x <- mtcars
setDT(x)
x[.N==1 | mpg >= 10,,by=carb]
我们可以使用.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
试试这个。
使用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)
更有效率。