You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:12:26