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
-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]
推荐阅读
- elasticsearch - 我们如何通过 elasticserach odbc 连接在 nginx 后面运行的 elasticsearch?
- html - 尝试使用 Flex 框填充空白空间
- java - 在最后一行 JAVA 中打印多个循环
- forms - FormData 发送具有三个不同值的相同三个键
- json - Swagger UI:定义额外的 curl 参数
- c++ - Linux utf16 到 c++ 上的 utf8
- c# - 多个用户同时读取密钥时的 web.config 问题
- javascript - 返回一个带有承诺的布尔值
- python - 如何创建包含字典元素列表的嵌套列表?
- android - Google 助理对话操作