首页 > 解决方案 > 每组,选择第一行和另一个匹配条件的行

问题描述

假设我有以下data.table:

x <- data.table(a = c(1, 3, 2, 2, 4, 3, 7, 10, 9, 8),
                b = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3))

并且,在按 分组后b,我想选择以下行:

如果单行同时满足这两个条件,则应仅选择一次(该组将仅包含一行)。

这些选择中的每一个都是微不足道的:

x[, .SD[1], by = b]  # selects first row per group
#    b  a
# 1: 1  1
# 2: 2  2
# 3: 3 10

x[, .SD[which.max(a)], by = b]  # selects row with the highest 'a' in the group
#    b  a
# 1: 1  3
# 2: 2  7
# 3: 3 10

但我不知道如何同时做这两个(显然.SD[1 | which.max(a)]不起作用)。我可以分别执行它们,然后rbindlist执行最终结果,但我想知道是否有更简单的方法。

为清楚起见,在上述情况下,预期输出将是(也可以接受不同的顺序):

   b  a
1: 1  1
2: 1  3
3: 2  2
4: 2  7
5: 3 10

标签: rdata.table

解决方案


一种选择是将索引 1(第一行)与which.max-returns 数字索引一起连接,然后取其中unique的一个(如果返回相同的值 1which.max并使用它来子集 data.table ( .SD)

x[, .SD[unique(c(1, which.max(a)))], by = b]
#   b  a
#1: 1  1
#2: 1  3
#3: 2  2
#4: 2  7
#5: 3 10

或使用.I

x[x[, .I[unique(c(1, which.max(a)))], by = b]$V1]

推荐阅读