SAS中proc transpose无法识别数字年份变量范围的解决方法
问题原因
SAS默认的变量命名规则要求变量名不能以数字开头,当你导入列名为纯数字年份的数据集时,SAS会自动将这类变量识别为名称常量(Name Literal),必须按照'变量名'n的格式引用。直接写2013-2021时,SAS会将开头的2013解析为普通数值,无法识别为变量名,自然不支持连续范围写法。
解决方法
方法1:直接使用名称常量格式引用连续变量(最简便,无需修改原数据)
提前确认SAS的VALIDVARNAME选项为ANY(导入纯数字列名的数据集时SAS会自动开启该选项,也可以手动执行语句设置),之后在var语句中给起止年份都加上'n后缀即可识别连续范围:
options validvarname=any; /* 确保支持名称常量写法,已开启可省略 */ proc transpose data=sampledata out=long1; var '2013'n - '2021'n; /* 数字开头的变量用'xxx'n格式引用 */ by CompanyID; run;
转置完成后,原列名会存在自动生成的_NAME_字段中,如果需要数值型年份,可以新增一步转换:
data long1; set long1; year = input(_NAME_,4.); /* 把字符型的年份列名转为数值 */ rename COL1=metric_value; /* 把转置后的指标值列重命名为易读名称 */ drop _NAME_; run;
方法2:重命名原变量为常规命名格式
如果不想每次引用变量都加'n后缀,可以先把所有年份列重命名为带字母前缀的常规SAS变量名,之后就可以直接用横杠连接的范围写法:
/* 第一步:重命名列 */ data sampledata_rename; set sampledata; rename '2013'n = y2013 '2014'n = y2014 '2015'n = y2015 '2016'n = y2016 '2017'n = y2017 '2018'n = y2018 '2019'n = y2019 '2020'n = y2020 '2021'n = y2021; run; /* 第二步:正常执行转置 */ proc transpose data=sampledata_rename out=long1; var y2013-y2021; by CompanyID; run;
内容的提问来源于stack exchange,提问作者Day312
相关产品推荐
相关产品推荐

