根据关键字,将多个数据集的相同关键字的数据合并到同一行。前提:1、数据集需要按照关键字排序、2、多个数据集除了关键字有相同变量名外,其余想合并到一起的变量其变量名不能相同,否则不能合并。
1 data mysas.mmsuserdec; 2 infile 'E:\SAS\mysas\mmsuserdec.txt' dlm='09'x firstobs=2; 3 input date $ city $ a b c d; 4 run; 5 data mysas.mmsusernov; 6 infile 'E:\SAS\mysas\mmsusernov.txt' dlm='09'x firstobs=2; 7 input date $ city $ a1 b1 c1 d1; 8 run; 9 proc sort data=mysas.mmsuserdec; 10 by city; 11 run; 12 proc sort data=mysas.mmsusernov; 13 by city; 14 run; 15 data mysas.mmsuser; 16 merge mysas.mmsuserdec mysas.mmsusernov; 17 by city; 18 run; 19 proc print data=mysas.mmsuser; 20 run;
若需要在某数据集后增加某列汇总一类的统计值,可以与proc means过程步一起实现,其中means过程步输出成一个数据集,然后merge
1 proc means data=mysas.mmsusernov; 2 var b1; 3 by date1; 4 output out=mysas.mmsusernov_sum sum(b1)=total; 5 run; 6 data mysas.mmsueernov_merge_sum; 7 merge mysas.mmsusernov mysas.mmsusernov_sum; 8 by date1; 9 pre=b1/total; 10 run; 11 proc print data=mysas.mmsueernov_merge_sum; 12 run;
由于merge需要关键字匹配,否则只是记录堆叠。所以如果想往每一行添加一个汇总的变量,merge就不够用了,利用sas 中set 语句的retain默认情况,可以用如下方式实现。
1 proc means data=mysas.mmsuserdec; 2 var b; 3 output out=mysas.mmsuserdec_sum sum(b)=b_sum; 4 run; 5 6 data mysas.mmsuserdec_sum_merge; 7 if _n_=1 then set mysas.mmsuserdec_sum; 8 set mysas.mmsuserdec; 9 run; 10 proc print data=mysas.mmsuserdec_sum_merge; 11 run;
其中_N_表示行号,当行号为1时,取汇总数据集中唯一的汇总变量,然后retain 下一行由于不符合if 仍然保持该值,所以实现往原数据集中添加汇总列。也可以在data后和set后用同样的数据集名称,实现rewrite。