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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:53:10