如何在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
相关产品推荐
相关产品推荐

