gpt4 book ai didi

r - dplyr group_by 超过两列的元素

转载 作者:行者123 更新时间:2023-12-02 05:32:32 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com