我的数据集的简化版本可以通过以下方式复制:
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/