如何用dplyr/tidyverse重塑数据框为每玩家单行列示weight与r得分格式
解法(基于tidyverse生态)
直接使用tidyr包的pivot_longer()多值匹配转换功能即可实现,完全保留原有行顺序、标识字段不变,自动保证同玩家的r得分和weight权重配对正确,不会出现错配。
完整可运行代码
# 加载tidyverse(包含dplyr、tidyr等核心包) library(tidyverse) # 原始示例数据 df <- data.frame( gameround= c("1_1", "1_2", "1_3"), r001 = c(3,5,4), r002 = c(2,3,5), r003 = c(1,2,2), weight001=c(0.7,0.8,0.7), weight002 = c(0.6,0.1,0.6), weight003=c(0.2,0.7,0.2) ) # 宽表转长表核心逻辑 df_long <- df %>% pivot_longer( cols = -gameround, # 仅转换除对局标识外的所有列 names_to = c(".value", "player_id"), # 正则匹配列名:前缀为r/weight,后缀为玩家ID数字 names_pattern = "(r|weight)(\\d+)" )
可选字段调整(完全匹配期望输出格式)
如果需要完全对齐示例中的weightid、rid字段,可额外增加字段重命名、排序逻辑:
df_long <- df_long %>% mutate(weightid = player_id, rid = player_id) %>% select(gameround, weightid, weight, rid, r)
输出验证
转换后的结果与需求给出的期望输出完全一致,对局顺序、玩家ID顺序都与原宽表保持相同,同玩家的r和weight配对100%准确。
内容的提问来源于stack exchange,提问作者scarlett rouge
相关产品推荐
相关产品推荐

