pivot/reshape 数据框(保持 order/identifiers 完整)dplyr tidyverse

pivot/reshape dataframe (keep order/identifiers intact) dplyr tidyverse

如何重塑此数据框,使每一行代表一名球员的体重和得分 (r)。每个玩家都用数字标记标识(玩家“001”、“002”等)。

我有一个包含很多球员和分数的大型数据框,需要像这样重塑它:

rm(list = ls())
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))

#current output
#gameround r001 r002 r003 weight001 weight002 weight003  
#1_1         3    2    1       0.7       0.6       0.2
#1_2         5    3    2       0.8       0.1       0.7
#1_3         4    5    2       0.7       0.6       0.2

#desired output (it is also okay to leave the weightid and rid out if a 
#certain method can ascertain that the weight-player pairs remain intact)

#gameround weightid  weight   rid    r
#1_1        001        0.7    001    3
#1_1        002        0.6    002    2
#1_1        003        0.2    003    1
#1_2        001        0.8    001    5
#1_2        002        0.1    002    3
#1_2        003        0.7    003    2
#1_3        001        0.7    001    4
#1_3        002        0.6    002    5
#1_3        003        0.2    003    2

使用pivot_longer-

tidyr::pivot_longer(df, 
                    cols = -gameround, 
                    names_to = c('.value', 'id'), 
                    names_pattern = '([a-z]+)(\d+)')

#  gameround id        r weight
#  <chr>     <chr> <dbl>  <dbl>
#1 1_1       001       3    0.7
#2 1_1       002       2    0.6
#3 1_1       003       1    0.2
#4 1_2       001       5    0.8
#5 1_2       002       3    0.1
#6 1_2       003       2    0.7
#7 1_3       001       4    0.7
#8 1_3       002       5    0.6
#9 1_3       003       2    0.2