在R语言中使用pivot_longer实现多列数据宽转长的技术咨询
问题描述
现有如下格式的数据集,每行对应一所学校,包含该校两名受访学生的姓名及两份问卷回答:
df <- data.frame( school = c("School 1", "School 2", "School 3"), Student1_Name = c("Name1A", "Name1B", "Name1C"), Student1_Resp1 = c(1,1,2), Student1_Resp2 = c(2,1,2), Student2_Name = c("Name2A", "Name2B", "Name2C"), Student2_Resp1 = c(2,2,2), Student2_Resp2 = c(1,2,1) )
数据预览:
> df school Student1_Name Student1_Resp1 Student1_Resp2 Student2_Name Student2_Resp1 Student2_Resp2 1 School 1 Name1A 1 2 Name2A 2 1 2 School 2 Name1B 1 1 Name2B 2 2 3 School 3 Name1C 2 2 Name2C 2 1
需要使用pivot_longer函数将数据转换为以下格式:
school Student_Name Student_Resp1 Student_Resp2 1 School 1 Name1A 1 2 2 School 1 Name2A 2 1 3 School 2 Name1B 1 1 4 School 2 Name2B 2 2 5 School 3 Name1C 2 2 6 School 3 Name2C 2 1
解决方法
使用tidyr包的pivot_longer函数,通过正则表达式拆分列名实现宽表转长表:
library(tidyr) df_long <- df %>% pivot_longer( cols = -school, names_to = c("temp", ".value"), names_pattern = "(Student\\d+)_(.*)" ) %>% select(-temp)
参数说明:
cols = -school:指定除school外的所有列参与转换names_to = c("temp", ".value"):拆分列名后,第一部分存入临时列temp,第二部分作为新的列名(.value是特殊关键字,代表保留字段值的列)names_pattern = "(Student\\d+)_(.*)":用正则表达式匹配列名结构,将StudentX和后续的Name/Resp1/Resp2拆分为两部分
转换后的结果与需求完全一致:
> df_long # A tibble: 6 × 4 school Student_Name Student_Resp1 Student_Resp2 <chr> <chr> <dbl> <dbl> 1 School 1 Name1A 1 2 2 School 1 Name2A 2 1 3 School 2 Name1B 1 1 4 School 2 Name2B 2 2 5 School 3 Name1C 2 2 6 School 3 Name2C 2 1
内容的提问来源于stack exchange,提问作者unaeem
相关产品推荐
相关产品推荐

