SAS行列转换一定要用proc transpose?No No No,其他2种替代方案同样实现!

SAS行列转换一定要用proc transpose?No No No,介绍其他2种替代方案同样实现!

行列转换简单示例

Before转换

Obs TRTN AGEGR1N AVAL
1 1 1 11
2 1 2 12
3 1 3 13
4 2 1 21
5 2 2 22
6 2 3 23

After转换

Obs TRTN AGEGR_1 AGEGR_2 AGEGR_3
1 1 11 12 13
2 2 21 22 23

>首选方案

proc transpose一发入魂?code示例如下

data test;
TRTN=1; AGEGR1N=1; AVAL=11; output;
TRTN=1; AGEGR1N=2; AVAL=12; output;
TRTN=1; AGEGR1N=3; AVAL=13; output;
TRTN=2; AGEGR1N=1; AVAL=21; output;
TRTN=2; AGEGR1N=2; AVAL=22; output;
TRTN=2; AGEGR1N=3; AVAL=23; output;
run;
proc transpose data=test out=test_tran0 prefix=AGEGR_;
  by TRTN;
  id AGEGR1N;
  var AVAL;
run;

>替代方案1

利用data过程步的retain+if first/if last组合

data test_tran1;
  set test;
  by TRTN AGEGR1N;
  retain AGEGR_1 AGEGR_2 AGEGR_3;
  if first.TRTN then call missing(AGEGR_1,AGEGR_2,AGEGR_3);
  if AGEGR1N=1 then AGEGR_1=AVAL;
  if AGEGR1N=2 then AGEGR_2=AVAL;
  if AGEGR1N=3 then AGEGR_3=AVAL;
  if last.TRTN then output;
  keep TRTN AGEGR_1 AGEGR_2 AGEGR_3;
run;

>替代方案2

讨厌data过程步,特别偏爱sql的小伙伴们可以看看下面示例code,估计很少有人用,我反正是没见过其他sp这个写过,嘿嘿

proc sql noprint;
  create table test_tran2 as
  select distinct TRTN
            , max(case when AGEGR1N=1 then AVAL else . end) as AGEGR_1
            , max(case when AGEGR1N=2 then AVAL else . end) as AGEGR_2
            , max(case when AGEGR1N=3 then AVAL else . end) as AGEGR_3
  from test
  group by TRTN;
quit;

>两种方案的执行结果

results.png

结论

码code是个辛苦的体力活,偶尔换个解法,换个思维,枯燥也许会变的有趣,工作也许更有动力。
以上介绍仅供参考,具体问题具体对待,如果有更有趣的解法欢迎留言探讨,共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容