假设我有以下数据表:
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
分组后,我想选择以下行:
- 是组的第一行
- 在组中拥有最高的
a
如果一行同时满足这两个条件,则只应选择一次(该组将只包含一行)。
这些选择中的每一个都是微不足道的:
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
最佳答案
一个选项是将索引 1(对于第一行)与 which.max
连接起来 - 也返回一个数字索引,然后取该索引的 unique
(如果 which.max
返回相同的值 1 并使用它来子集 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]
关于r - 每组,选择第一行和符合条件的另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106776/