You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何汇总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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:20:33