使用dplyr与stubs重塑数据:宽表转长表代码问题求助
R语言宽表转长表:修正pivot_longer代码实现目标转换
原始数据与目标结果
DATA=data.frame( STUDENT =c(1, 2, 3), GRADE1 =c(7, 3, NA), GRADE2 =c(6, 5, 9), GRADE3 =c(4, NA, 2), GYM1 =c(2, 0, NA), GYM2 =c(9, 7, 7), GYM3 =c(1, NA, 6) ) DATAWANT = data.frame( STUDENT =c(1, 1, 1, 2, 2, 3, 3), TIME =c(1, 2, 3, 1, 2, 2, 3), GRADE =c(7, 6, 4, 3, 5, 9, 2), GYM =c(2, 9, 1, 0, 7, 7, 6) )
原代码问题分析
names_to参数逻辑错误:你试图直接将列名映射到GRADE和GYM,但pivot_longer需要先拆分列名为「指标类型」和「时间标记」两个部分,再通过.value关键字将指标类型转为新列名。- 正则表达式不匹配:原始列名是
GRADE1、GYM1这类无下划线的格式,你写的正则包含下划线和Grade字符串,完全无法匹配目标内容。
修正后的代码
library(tidyr) library(dplyr) DATAWANT.CORRECT <- DATA %>% pivot_longer( cols = -STUDENT, # .value表示将匹配的前缀作为新列名,TIME提取数字部分 names_to = c(".value", "TIME"), # 正则匹配:非数字前缀(GRADE/GYM)+ 数字后缀(1/2/3) names_pattern = "(\\D+)(\\d+)", # 自动删除含NA的行,匹配目标结果 values_drop_na = TRUE ) %>% # 将TIME转为整数类型,和目标数据格式一致 mutate(TIME = as.integer(TIME))
运行上述代码后,DATAWANT.CORRECT的结构和内容与DATAWANT完全一致。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

