SAS proc transpose按组转置含字符变量长表为宽表的问题
SAS长格式转宽格式解决方案
核心错误原因
- 原代码
by语句指定错误:你需要按id分组生成每一行结果,却错误指定了by value,分组逻辑完全错误,才会出现明明数据集已排序却报by组未排序的报错 - 原代码
id和var语句的变量逻辑颠倒:id语句需要指定生成宽表列名的序号变量(也就是你数据集里的observation变量),var语句需要指定要转置为宽列的值变量(也就是value变量)
正确实现代码
第一步:提前按分组变量排序(彻底解决by组排序报错)
proc sort data=have; by id observation; run;
第二步:执行转置操作(自动适配不同id的观测数量差异,缺失位置自动填充缺失值)
prefix参数用来指定转置后列名的前缀,和observation变量的值拼接后正好生成你需要的observation1/2/3列名
proc transpose data=have out=temp_want prefix=observation; by id; id observation; var value; run;
第三步:缺失值替换为'NA'(可选,匹配你的预期输出格式)
SAS默认字符型缺失值为空,如果你需要显式显示为NA,可以执行以下代码批量替换:
data want; set temp_want; /* 批量匹配所有observation开头的列 */ array obs_cols[*] $ observation:; do i = 1 to dim(obs_cols); if obs_cols[i] = '' then obs_cols[i] = 'NA'; end; /* 删掉不需要的中间变量 */ drop i _name_; run;
内容的提问来源于stack exchange,提问作者vkvk2525
相关产品推荐
相关产品推荐

