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) 更有效率。