如何在R中用pivot_wider按分组将变量的唯一值转为宽格式列?
用一次
pivot_wider()实现需求 完全可以通过一次pivot_wider()调用完成转换,核心是先给每个Student组内的观测添加一个序号标记,作为宽表转换的列名区分依据。
实现步骤
- 给每个学生的两行观测添加组内序号(
ref_num,取值1/2),用来区分第1、第2位裁判 - 调用
pivot_wider(),通过names_from指定序号列,values_from指定要转换的Referee和Rating列,同时用names_glue自定义输出列名,直接得到目标格式的列名
完整代码
library(tidyverse) # 原始数据 df <- data.frame(Student = rep(c(17383, 16487, 17646, 2648, 3785), each = 2), Referee = c("Paul Severe", "Cathy Nice", "Jean Exigeant", "Hilda Ehrlich", "John Rates", "Eva Luates", "Fred Notebien", "Aldous Grading", "Hans Streng", "Anna Filaktic"), Rating = format(round(x = sqrt(sample(15:95, 10, replace = TRUE)), digits = 3), nsmall = 3) ) # 一次pivot_wider完成转换 df_result <- df %>% group_by(Student) %>% mutate(ref_num = row_number()) %>% # 添加组内序号 pivot_wider( id_cols = Student, names_from = ref_num, values_from = c(Referee, Rating), names_glue = "{case_when(.value == 'Referee' ~ '{.value}_{ref_num}', .value == 'Rating' ~ 'Rating_Ref_{ref_num}')}" ) %>% ungroup() # 查看结果 df_result
结果说明
转换后的结果和你手动生成的df_wanted结构完全一致:每个学生对应一行,包含Referee_1/Referee_2两位裁判姓名,以及对应的Rating_Ref_1/Rating_Ref_2评分。
内容的提问来源于stack exchange,提问作者D___
相关产品推荐
相关产品推荐

