r - dplyr group_by 超过两列的元素

标签 r dplyr grouping tidyverse

我的数据集的简化版本可以通过以下方式复制:

df <- data.frame(buyer = c("A","C","B"),
                 seller = c("B","D","E"),
                 amount = c(1,2,3))

我正在寻找一个最好的 dplyr 解决方案来实现以下目标。

buyer          seller       amount
  A              B           1
  C              D           2
  B              E           3

应该为每个代理(A、B、C、D、E)生成一个分组摘要

output
agent     total_amount
  A        1
  B        4 #(=1+3)
  C        2
  D        2

我可以为买家和卖家分组,然后添加结果,但这并不优雅,而且有些麻烦。

library(dplyr)
res_b <- df %>%
      group_by(buyer) %>%
      summarise(total_amount=sum(amount))
res_s <- df %>%
      group_by(seller) %>%
      summarise(total_amount=sum(amount))

感谢任何帮助。显然也欢迎其他解决方案(不在 tidyverse 中)。

编辑:应该说我的原始数据集大约有 60 百万个观察值。

最佳答案

我们可以先转换为长格式,然后做一个简单的聚合,即

library(tidyverse)

df %>% 
 gather(var, agent, -amount) %>% 
 group_by(agent) %>% 
 summarise(total_amount = sum(amount))

这给出了,

# A tibble: 5 x 2
  agent   total_amount
  <chr>          <dbl>
1 A                1
2 B                4
3 C                2
4 D                2
5 E                3

您可以尝试使用 data.table 来提高效率。这里直接翻译上面的tidyverse代码,

library(data.table)

dt1 <- setDT(df)
melt(dt1, measure.vars = c('buyer', 'seller'), id.vars = 'amount', value.name = "agent"
     )[, .(total_amount = sum(amount)), by = agent][]
#   agent total_amount
#1:     A            1
#2:     C            2
#3:     B            4
#4:     D            2
#5:     E            3

关于r - dplyr group_by 超过两列的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889335/

相关文章:

r - ggplot2 是否有一种简单的方法来包装注释文本?

r - 手动实现回归似然比检验

r - 如何在 R 中使用 dplyr 执行多个左连接

python - 如何通过相邻值分割矩阵?

bash 总和分组循环

R - 从 .txt 文件中读取特定行之后的行

r - 从 R 中的邻接矩阵/边列表生成簇

r - 在 R 中,发现与另一个数据框中的行部分匹配的行

r - 对列中的多个值使用ifelse语句

c# - linq 中的虚拟(预定义)列分组