使用reshape函数转宽表为长表时遇‘varying参数长度不一致’错误求助
宽转长reshape报错及解决方法
一、reshape函数错误修复
你的报错核心是varying参数内的变量分组长度不一致。仔细检查代码里的sd_ATP系列变量:
"sd_ATP0", "sd_ATP1", "sd_ATP2", "sd_ATP3", "cm_ATP4"
最后一个变量出现笔误,应该是sd_ATP4而非cm_ATP4——这个错误导致该组只有4个有效变量,其他组均为5个(对应TIME0到TIME4),整体长度不匹配触发了报错。修正这个变量名后,reshape即可正常运行。
修正后的核心代码片段:
c1dat0_long <- reshape(widedata, varying = c("ATT0", "ATT1", "ATT2", "ATT3", "ATT4", "ATP0", "ATP1", "ATP2", "ATP3", "ATP4", "n_ATT0", "n_ATT1", "n_ATT2", "n_ATT3", "n_ATT4", "cm_ATP0", "cm_ATP1", "cm_ATP2", "cm_ATP3", "cm_ATP4", "sd_ATP0", "sd_ATP1", "sd_ATP2", "sd_ATP3", "sd_ATP4", # 此处已修正 "n_NEW0", "n_NEW1", "n_NEW2", "n_NEW3", "n_NEW4", "cm_AGE0", "cm_AGE1", "cm_AGE2", "cm_AGE3", "cm_AGE4", "p_FEMALE0", "p_FEMALE1", "p_FEMALE2", "p_FEMALE3", "p_FEMALE4", "n_FEMALE0", "n_FEMALE1", "n_FEMALE2", "n_FEMALE3", "n_FEMALE4"), idvar = "ID", sep="", timevar = "TIME", direction = "long")
二、tidyr::pivot_longer的正确用法
如果想用pivot_longer替代,可通过正则拆分变量名,更直观且不易出错:
library(tidyr) c1dat0_long <- pivot_longer(widedata, cols = -ID, # 排除ID列,其余列全部转长 names_to = c(".value", "TIME"), # 变量名拆为两部分:.value保留指标名作为新列名,TIME存时间后缀 names_pattern = "(.*)(\\d)" # 正则匹配:非数字前缀为指标,末尾数字为时间 )
若时间后缀是多位数字(如TIME10),可将正则表达式改为"(.*)(\\d+)"。
内容的提问来源于stack exchange,提问作者ACK3
相关产品推荐
相关产品推荐

