R/dplyr使用pivot_wider重塑数据框时如何在过程中对数值求和
问题原因
你的测试数据中,sub_category与category的组合存在重复观测:sub_category = 'b'对应的category='A'有2行数据、category='B'也有2行数据,宽转换时同一分组下存在多个数值,才会出现列表列、spread报错的情况。spread是tidyr的旧版宽转换函数,本身不支持同一键组合下多值的自动处理,遇到重复键就会直接抛出唯一键错误,现在官方更推荐使用功能更灵活的pivot_wider完成宽转换操作。
解决方案
你需要在pivot_wider中调用values_fn参数,直接指定对同一分组下的多个数值执行求和操作,一步就能得到你要的结果:
library(tidyverse) test_data <- data.frame( category=c('A','A','A','B','B','B'), sub_category=c('a','b','b','a','b','b'), amount=1:6 ) test_data %>% pivot_wider( names_from = 'category', values_from = 'amount', values_fn = sum )
运行后输出的结果如下:
| sub_category | A | B |
|---|---|---|
| a | 1 | 4 |
| b | 5 | 11 |
如果你的需求不是聚合求和,而是要保留所有原始行的数值,可以先给同一键组合的行添加唯一标识列再做宽转换:
test_data %>% group_by(category, sub_category) %>% mutate(row_id = row_number()) %>% pivot_wider( names_from = 'category', values_from = 'amount' )
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

