r - 每组,选择第一行和符合条件的另一行

标签 r 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 分组后,我想选择以下行:

  • 是组的第一行
  • 在组中拥有最高的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/

相关文章:

R data.table滑动窗口

将变量名称向量中的 Inf/-Inf 值替换为类似命名的变量向量 (substr/grep/gsub) 中的值

r - 将几列合并为一列 (R)

R中介分析——引导

r - 使条形图中的条具有相同的高度

r - 包含 Markdown 时 Shiny 的主面板宽度

R:总结多个变量的观察次数的最快方法

r - 如何使用 R 中的过渡日期数据创建面板数据集?

r - 分组执行 ifelse 的更好方法

r - R 中的 fread 错误 - 字符串 : '\0' 中嵌入 nul