R语言reshape宽表转长表时smk与riskydrk列值错位求助
问题排查与解决
问题现象
使用reshape()将宽格式数据集转换为长格式时,smk列与riskydrk列的值错位:smk列本应显示1、2这类取值,却被替换为riskydrk列的"Yes/No"值。
问题原因
reshape()函数的varying参数要求按变量类型分组排列(即先集中所有时间点的age变量,再集中所有时间点的bmi变量,以此类推),但原代码中是按时间点分组排列(每个时间点的所有变量放在一组),这导致变量映射顺序和v.names定义的顺序不匹配,最终出现列值错位。
解决代码
调整varying参数的变量顺序,按变量类型分组:
reshape(dw, direction='long', varying=list( # 所有age变量按时间顺序排列 c('base.age', 'fu1.age', 'fu2.age', 'fu3.age', 'fu7.age', 'fu5.age', 'fu6.age'), # 所有bmi变量按时间顺序排列 c('base.bmi', 'fu1.bmi', 'fu2.bmi', 'fu3.bmi', 'fu7.bmi', 'fu5.bmi', 'fu6.bmi'), # 所有MET变量按时间顺序排列 c('base.MET', 'fu1.MET', 'fu2.MET', 'fu3.MET', 'fu7.MET', 'fu5.MET', 'fu6.MET'), # 所有CDC变量按时间顺序排列 c('base.CDC', 'fu1.CDC', 'fu2.CDC', 'fu3.CDC', 'fu7.CDC', 'fu5.CDC', 'fu6.CDC'), # 所有smk变量按时间顺序排列 c('base.smk', 'fu1.smk', 'fu2.smk', 'fu3.smk', 'fu7.smk', 'fu5.smk', 'fu6.smk'), # 所有riskydrk变量按时间顺序排列 c('base.riskydrk', 'fu1.riskydrk', 'fu2.riskydrk', 'fu3.riskydrk', 'fu7.riskydrk', 'fu5.riskydrk', 'fu6.riskydrk') ), timevar='var', times=c('base', 'fu1', 'fu2', 'fu3', 'fu7', 'fu5', 'fu6'), v.names=c('age', 'bmi', 'MET', 'CDC', 'smk', 'riskydrk'), idvar='ccssid')
也可以用字符串向量的方式按类型分组排列(效果与列表形式一致):
reshape(dw, direction='long', varying=c( 'base.age', 'fu1.age', 'fu2.age', 'fu3.age', 'fu7.age', 'fu5.age', 'fu6.age', 'base.bmi', 'fu1.bmi', 'fu2.bmi', 'fu3.bmi', 'fu7.bmi', 'fu5.bmi', 'fu6.bmi', 'base.MET', 'fu1.MET', 'fu2.MET', 'fu3.MET', 'fu7.MET', 'fu5.MET', 'fu6.MET', 'base.CDC', 'fu1.CDC', 'fu2.CDC', 'fu3.CDC', 'fu7.CDC', 'fu5.CDC', 'fu6.CDC', 'base.smk', 'fu1.smk', 'fu2.smk', 'fu3.smk', 'fu7.smk', 'fu5.smk', 'fu6.smk', 'base.riskydrk', 'fu1.riskydrk', 'fu2.riskydrk', 'fu3.riskydrk', 'fu7.riskydrk', 'fu5.riskydrk', 'fu6.riskydrk' ), timevar='var', times=c('base', 'fu1', 'fu2', 'fu3', 'fu7', 'fu5', 'fu6'), v.names=c('age', 'bmi', 'MET', 'CDC', 'smk', 'riskydrk'), idvar='ccssid')
验证效果
调整后,smk列将正确显示1、2等取值,riskydrk列显示Yes/No,与期望输出一致。
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

