R语言:按分组对指定列实现长表转宽表的方法咨询
这问题我熟!你需要把组内的贡献数据转成宽格式后,和原表做关联,这样每个玩家的行就能带上同组所有人的贡献值了。用dplyr + tidyr的组合就能轻松搞定,具体步骤如下:
1. 准备工作
先加载需要的R包:
library(dplyr) library(tidyr)
2. 生成组级宽格式贡献表
从原数据中提取出分组、玩家ID和贡献列,再用pivot_wider把每个组的贡献数据转换成宽格式,生成规范命名的列(比如player_1_contribution):
group_contributions <- df %>% select(group_id, player_id, player_contribution) %>% pivot_wider( id_cols = group_id, names_from = player_id, values_from = player_contribution, names_glue = "player_{player_id}_contribution" # 自定义列名格式 )
3. 关联原表与组级宽表
把生成的组级宽表和原数据按照group_id做左连接,这样每个玩家的观测行就会自动带上同组所有成员的贡献数据:
result_df <- df %>% left_join(group_contributions, by = "group_id")
验证结果
运行完代码后,result_df的结构就会完全符合你的需求:
group_id player_id player_decision player_contribution player_1_contribution player_2_contribution player_3_contribution
1 1 10 6 6 5 4
1 2 20 5 6 5 4
1 3 30 4 6 5 4
2 1 40 3 3 2 1
2 2 50 2 3 2 1
2 3 60 1 3 2 1
补充说明
- 你提到的
gather()是宽表转长表的工具,这里我们需要反向操作,所以用pivot_wider()(它是旧函数spread()的升级版,功能更灵活)。 - 如果你的数据中不同组的玩家数量不一致,这个方法依然适用,
pivot_wider()会自动为所有出现过的玩家ID生成对应列,缺失值会用NA填充。
内容的提问来源于stack exchange,提问作者Philipp Chapkovski

