也说行列互换之proc transpose

标签:
sastranspose转置行列互换 |
分类: Data_Coding |
题记:不能偷懒了……
其实proc
transpose还是挺复杂的(个人感觉),不知为啥,初次接触时,想起来那时学线性代数的不易(现在也忘光了)。
Transpose:转置,调换顺序。顾名思义,调换行列的位置,即行列互换。
大致语法如下图:http://s16/middle/41889b90taf654dac3a0f&690transpose" TITLE="也说行列互换之proc
data 和out指定源数据集和目标数据集,label和name为转置后SAS自动生成的变量(_label_, _name_)改名。Prefix 和ID联合控制目标数据集中的转置后生成的变量名。Var 和By联合控制转置后生成的“数据矩阵”, Var为要转置的变量,by 指定分组变量。
实例:
Topic1、转一个变量。Old1 转成new1。
http://s6/middle/41889b90taf654f681f25&690transpose" TITLE="也说行列互换之proc
****solution1: proc transpose*****;
proc transpose data=old1 out=new1 (drop=_name_) prefix=date;
run;
*****solution2: do+array****;
data new1(drop=i date);
run;
注:上面的do +array 的方法 有两个弱点;1、code较多。2、必须知道OLD中各NAME的date的确切个数,且这个数必需相等。
改进:计算出各NAME的DATE计数,并找其中的最大值 ,赋组宏变量,传给数组。
proc sql noprint;
%let max=&max;
data new1(drop=i date);
run;
*** proc transpose***;
proc transpose data=new1 out=old1_back(drop=_name_ rename=(col1=date)) ;
run;
*****do +array****;
data old1_back(keep=name date);
run;
Topic2、 转多个变量。数据集old2 转new2。
多个变量的转置会有所不同,以两个变量为例。
http://s7/middle/41889b90taf654f869ad6&690transpose" TITLE="也说行列互换之proc
data new2(drop=i date result);
run;
solution2: proc transpose +merge
*****solution1plus: proc transpoe +merge***;
proc transpose data=old2 out=tmp;
run;
data new2(drop=_name_);
run;
proc transpose data=old2 out=tmp1(drop=_name_) prefix=date;
run;
proc transpose data=old2 out=tmp2(drop=_name_) prefix=result;
run;
data
run;
****do +array****;
data old2_back(keep=name date result);
run;
***transpose +merge****;
proc transpose data=new2 out=old2_tmp;
run;
data old2_back(drop=_name_);
run;
参考:1.SUGI PAPER, An Animated Guide: Proc Transpose