希望你一切都好。我想 a) 如果 B 列中的值彼此相等且 C 列中的值彼此相等,则将 A 列中的值相加,同时 b) 在新求和行中,仅保留来自D 列与该求和组中 A 列的最大值相匹配。
我认为如果没有示例就很难解释我的查询。
让我们假设这些是相关数据:
df <- data.frame (A = c(10, 1, 4, 3, 7),
B = c("a", "a", "b", "b", "b"),
C = c(.5, .5, 2.5, 1.5, 2.5),
D = c(54, 36, 94, 57, 49))
生成此数据框:
A B C D
1 10 a 0.5 54
2 1 a 0.5 36
3 4 b 2.5 94
4 3 b 1.5 57
5 7 b 2.5 49
请注意,B 和 C 中的第 1 行和第 2 行是等效的,因此应对它们求和。但第 1 行在 A 中的值较大,因此应保留 54 而不是 36。这与第 3 行和第 5 行类似。最终结果应为:
A B C D
11 a .5 54
3 b 1.5 57
11 b 2.5 49
我已经到了一半了。我找到了一些执行 a) 部分的代码。其中任何一个都可以解决问题:
aggregate(A ~ B + C, df, sum)
library(data.table)
setDT(df)[, .(summedvar = sum(A)), by = .(A, B)]
但是,毫不奇怪,这些方法会删除 D 列。我很好奇是否有人对如何合并 b) 部分有任何想法。也许我需要执行多个步骤?或者也许我以错误的方式处理这个问题?我非常感谢您的任何建议。
最佳答案
可以使用which.max
获取A
中最高值的索引,并获取D
对应的值。
使用dplyr
你可以这样做 -
library(dplyr)
df %>%
group_by(B, C) %>%
summarise(D = D[which.max(A)],
A = sum(A), .groups = "drop") %>%
select(A, B, C, D)
# A B C D
# <dbl> <chr> <dbl> <dbl>
#1 11 a 0.5 54
#2 3 b 1.5 57
#3 11 b 2.5 49
同样在data.table
中 -
library(data.table)
setDT(df)
df[, .(A = sum(A), D = D[which.max(A)]), .(B, C)]
关于r - 聚合具有共享值的行,同时在单独的列中选择值以保留在聚合行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72836534/