r - 聚合具有共享值的行,同时在单独的列中选择值以保留在聚合行中

标签 r aggregate

希望你一切都好。我想 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/

相关文章:

r - 尝试将表写入非默认模式时 SQL 函数不起作用

r - pmatch 以错误的方式返回字符匹配

R:如何将 300 个 1GB .rds 文件合并为 1 个大 rds 文件而不将它们读入内存?

python - 如何在 kubernetes 集群内使用脚本语言连接数据库

r - 如何重新采样捕捉到现有网格的栅格?

Elasticsearch:自动完成聚合中的可用存储桶

elasticsearch - Elasticsearch聚合是基于聚合还是多重聚合

r - 设置 ggplot 中纬度和经度轴标签的格式

带有分组过滤器的 Elasticsearch 结果