如何汇总DataFrame中Giver的金额总和及按Receiver的金额分布
解决方案
你可以通过分组汇总+宽表转换的方式实现需求,用tidyverse工具链的话,完整代码如下:
library(tidyverse) # 原始数据 df <- data.frame(Giver = c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'), Amount = c(100, 150, 150, 200, 100, 200, 100, 100, 100), Receiver = c('X', 'X', 'Y', 'X', 'Z', 'Z', 'Y', 'Y', 'Y')) # 生成目标DataFrame df_result <- df %>% # 按捐赠者+接收方分组,统计每组金额总和 group_by(Giver, Receiver) %>% summarize(Receiver_sum = sum(Amount), .groups = "drop") %>% # 转宽表:把接收方转为列,无捐赠的填充0 pivot_wider(names_from = Receiver, values_from = Receiver_sum, values_fill = 0) %>% # 计算每个捐赠者的总金额 mutate(Amount = rowSums(select(., X, Y, Z))) %>% # 调整列顺序匹配目标格式 select(Giver, Amount, X, Y, Z) %>% # 按捐赠者排序(和示例结果顺序一致) arrange(Giver) print(df_result)
运行后输出:
# A tibble: 3 × 5 Giver Amount X Y Z <chr> <dbl> <dbl> <dbl> <dbl> 1 A 400 250 150 0 2 B 500 200 0 300 3 C 300 0 300 0
关键步骤说明:
group_by(Giver, Receiver) %>% summarize(...):先拿到每个捐赠者给不同接收方的金额明细总和,这是分布统计的基础。pivot_wider(...):把长格式的接收方数据转为宽格式,values_fill = 0确保没有捐赠记录的接收方显示0而非缺失值。mutate(Amount = rowSums(...)):通过行求和得到每个捐赠者的总金额,替代你原代码里单独分组求和的逻辑。select(...):调整列的顺序,和你需要的目标输出对齐。
如果需要保留原代码中的Payments(交易次数),可以在第一步分组时加上Payments = n(),再整合到最终结果里即可。
内容的提问来源于stack exchange,提问作者Haidepzai
相关产品推荐
相关产品推荐

