对于我正在编写的SAS程序,我需要完全相同的将4个不同的工作表连接到一个表中。我最初只是在PROC SQL
中执行此操作,但很快就失控了,所以我决定在数据步骤中使用MERGE
进行设置。
举个例子:
proc sort data = TABLE_1; by COL1 COL2 COL3;
proc sort data = TABLE_2; by COL1 COL2 COL3;
proc sort data = TABLE_3; by COL1 COL2 COL3;
proc sort data = TABLE_4; by COL1 COL2 COL3;
data NEW_TABLE;
merge TABLE_1 TABLE_2 TABLE_3 TABLE_4;
by COL1 COL2 COL3;
需要使用相同的字段集对每个表进行单独排序似乎很麻烦。我已经设置了一个宏变量来等同于列名列表,但是我仍然需要为每个表创建一行。
如果它们都有相同的列,有没有办法在多个表上同时写一些内容来执行PROC SORT
?根据我对SAS的了解,我希望这样的事情可以发挥作用:
proc sort data = (TABLE_1 TABLE_2 TABLE_3 TABLE_4); by COL1 COL2 COL3;
或者甚至是这样的事情,如果这些表的编号如下例所示:
proc sort data = (TABLE_1-TABLE_4); by COL1 COL2 COL3;
但是我还没能上班。不可否认,我还没有尝试通过数组进行设置,但主要是因为对于如此短的表列表而言似乎有点过分(而较长的表列表可能会完全保证不同的合并解决方案)。
从响应here来看,我对一次在多个表上执行PROC并不乐观,尽管可能排序的工作方式不同。
答案 0 :(得分:3)
不,不可能拥有1 PROC SORT
并让它对多个表进行排序。您可以创建一个宏来为您编写繁琐的代码。喜欢这个
%macro sortem(tables,byvar);
%local i n table;
%let n=%sysfunc(countw(&tables));
%do i=1 %to &n;
%let table=%scan(&tables,&i);
proc sort data=&table;
by &byvar;
run;
%end;
%mend;
然后致电
%sortem(table_1 table_2 table_3 table_4, COL1 COL2 COL3);
答案 1 :(得分:1)
值得第二个答案。如果您有最新版本的SAS,则可以使用PROC DS2
进行合并。 DS2不要求您对表进行预先排序。请参阅以下示例:
data table1;
do x=1 to 100;
a = rannor(1);
output;
end;
run;
data table2; /*Reverse order*/
do x=100 to 1 by -1;
b = rannor(2);
output;
end;
run;
data table3;
do x=1 to 100;
c = rannor(3);
output;
end;
run;
proc sort data=table3; /*Make Table3 out of order*/
by c;
run;
proc ds2 ;
data work.comb /overwrite=yes;
method run();
merge table1 table2 table3;
by x;
end;
enddata;
run;
quit;