如何在R中使用pivot_wider实现行宽化并合并分组行?
问题描述
- 现有数据集包含
Group ID、Person、Role、Payoff字段,每个Group ID下对应Role为A和B的两行数据 - 目标:用R将数据集转为宽表,同一
Group ID对应的Role A、B的Person和Payoff值合并到同一行 - 遇到的问题:使用
pivot_wider(names_from = Role, values_from = c(Person, Payoff))后,同一Group ID被分成两行,且存在大量NA值 - 已尝试但未解决的代码:
data %>% group_by('session_group_id') %>% pivot_wider(names_from = Role, values_from = c(Person, Payoff))data %>% group_by('session_group_id') %>% pivot_wider(names_from = Role, values_from = c(Person, Payoff), values_fn = list)
解决方法
问题根源有两个:
group_by中给字段名加了引号,导致分组依据变成字符串常量而非实际列名,需去掉引号- 不需要额外执行
group_by,pivot_wider可通过指定id_cols自动完成分组合并
正确代码(假设Group ID列名为session_group_id)
data %>% pivot_wider( id_cols = session_group_id, # 指定作为行唯一标识的列 names_from = Role, values_from = c(Person, Payoff) )
特殊情况处理
如果你的Group ID列名是带空格的Group ID,需要用反引号包裹列名:
data %>% pivot_wider( id_cols = `Group ID`, names_from = Role, values_from = c(Person, Payoff) )
效果验证
假设原始数据为:
| session_group_id | Person | Role | Payoff |
|---|---|---|---|
| 1 | Alice | A | 100 |
| 1 | Bob | B | 200 |
| 2 | Charlie | A | 150 |
| 2 | Dave | B | 250 |
运行代码后会得到目标宽表:
| session_group_id | Person_A | Person_B | Payoff_A | Payoff_B |
|---|---|---|---|---|
| 1 | Alice | Bob | 100 | 200 |
| 2 | Charlie | Dave | 150 | 250 |
内容的提问来源于stack exchange,提问作者Samuel Priestley
相关产品推荐
相关产品推荐

