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

如何在R中重塑data.frame并按分组填充求和值?

解决R数据框重塑(长转宽+分组求和)的问题

我来帮你搞定这个数据重塑的问题!你想要的是把长格式的表格转成宽格式,同时对每个Group 1下不同Group 2对应的count值求和,对吧?咱们一步步来解决:

先明确你的原始数据

首先把你提到的包含重复Group 1的原始数据用代码还原(方便后续测试):

df <- data.frame(
  `Group 1` = c("a", "b", "c", "a", "a", "a", "b", "b"),
  `Group 2` = c("aa", "ab", "ac", "ab", "ac", "aa", "aa", "ac"),
  count = c(1, 6, 7, 4, 7, 1, 3, 5)
)

为什么你之前的操作会出错?

你之前加了mutate(id2 = sequence(n())),这会给每个Group 1组内的每一行分配一个递增序号,相当于强制把同一Group 1的行拆成独立条目,所以spread后会出现多行重复的Group 1记录。咱们只需要去掉这个多余的步骤,先做聚合再转宽就好。

方法1:用dplyr + tidyr::spread(经典组合)

先按Group 1和Group 2分组求和,再转换为宽格式,缺失的组合填充0:

library(dplyr)
library(tidyr)

df %>%
  # 先聚合:对每个Group1+Group2的组合求和
  group_by(`Group 1`, `Group 2`) %>%
  summarise(total_count = sum(count), .groups = "drop") %>%
  # 转宽格式,缺失值填0
  spread(`Group 2`, total_count, fill = 0)

运行后就能得到你想要的结果:

# A tibble: 3 × 4
  `Group 1`    aa    ab    ac
  <chr>     <dbl> <dbl> <dbl>
1 a             2     4     7
2 b             3     6     5
3 c             0     0     7

方法2:用tidyr::pivot_wider(新版推荐,更简洁)

tidyr的pivot_wider是spread的升级替代函数,支持直接在转宽时指定聚合函数,一步到位:

library(tidyr)
library(dplyr)

df %>%
  pivot_wider(
    id_cols = `Group 1`,          # 作为行的列
    names_from = `Group 2`,       # 作为列名的列
    values_from = count,          # 填充列值的列
    values_fn = sum,              # 对重复组合的取值求和
    values_fill = 0               # 缺失的组合填充0
  )

这个方法不需要单独做分组求和,values_fn参数会自动帮你计算每个Group1+Group2组合的总和,结果和上面完全一致。

内容的提问来源于stack exchange,提问作者dysonsphere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:43:26