如何在R中正确重塑宽表数据?现有pivot_longer代码输出异常
解决data.frame宽表转长表的pivot_longer错误问题
你的原始数据列名存在两种不一致的命名模式,导致原pivot_longer代码的正则表达式无法匹配所有列,进而得到错误结果:
- 模式1:前缀+数字+字母(如
Course1A、Time1A) - 模式2:前缀+字母+数字(如
TimeC3、ScoreC3)
原代码中的names_pattern = "([A-Za-z]+)([0-9]+[A-Z])"仅能匹配模式1,无法覆盖模式2的列,因此转换失败。
正确转换代码
library(tidyverse) # 宽表转长表,适配两种列名模式 reshaped_data <- data %>% pivot_longer( cols = -c(ID, Gender, Race, Health), names_to = c(".value", "Group"), # 正则表达式匹配两种列名模式的前缀与标识部分 names_pattern = "([A-Za-z]+)([0-9]+[A-Z]|[A-Z][0-9]+)" ) %>% # 保留目标列,移除临时生成的Group列 select(ID, Course, Time, Gender, Race, Health, Score)
代码说明
- 正则表达式调整:
([0-9]+[A-Z]|[A-Z][0-9]+)部分同时匹配"数字+字母"和"字母+数字"两种标识格式,确保所有Course/Time/Score开头的列都能被正确分组。 - 列筛选:通过
select保留你需要的7列,去掉转换过程中生成的Group辅助列。
验证结果
执行head(reshaped_data)可查看转换后的前几行长格式数据,每个ID会对应8条课程记录,结构完全符合需求。
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

