因此,我试图在sas中创建一个宏,并且试图在一个数据步骤中合并多个数据集。该宏还动态创建了各种不同的数据集,因此我不知道将要创建哪些数据集,哪些将不创建。我试图在一个数据步骤中合并四个数据集,并且试图仅合并存在的数据集,而不合并不存在的数据集。
除了在尝试做的事情外,还没有尝试过其他任何事情。
DATA Something;
MERGE Something SomethingElse AnotherThing EXIST(YetAnotherThing)*YetAnotherThing;
RUN;
很明显这是行不通的,因为SAS不能那样工作,但是我正在尝试做类似的事情,其中YetAnotherThing是我正在测试的数据集之一,以查看它是否存在并合并如果有的话,它会发送给某事。
答案 0 :(得分:2)
如果您有系统的命名约定,则可以简化。例如,如果您有一个通用前缀,它将变为:
data want;
merge prefix: ;
run;
如果它们都在同一个库中,这也很容易。但是否则,您将无法像上面那样检查每个名称。
答案 1 :(得分:1)
遵循以下原则:
data test1;
do i = 1 to 10;
val1 = i;
output;
end;
run;
data test2;
do i = 1 to 10;
val2 = i*2;
output;
end;
run;
data test3;
do i = 1 to 10;
val3 = i*3;
output;
end;
run;
data test5;
do i = 1 to 10;
val5 = i*4;
output;
end;
run;
%macro multi_merge(varlist);
%local j;
data test_merge;
set %scan(&varlist,1);
run;
%put %sysfunc(countw(&varlist));
%if %sysfunc(countw(&varlist)) > 1 %then %do;
%do j = 2 %to %sysfunc(countw(&varlist));
%if %sysfunc(exist(%scan(&varlist,&j))) %then %do;
data test_merge;
merge test_merge %scan(&varlist,&j);
by i;
run;
%end;
%end;
%end;
%mend;
%multi_merge(test1 test2 test3 test4 test5);
Test4不存在。
没有循环的同一件事:
如果您不想循环播放,可以执行以下操作:
%macro if_exists(varlist);
%if %sysfunc(exist(%scan(&varlist,1))) %then %scan(&varlist,1);
%mend;
data test_merge2;
merge test1
%if_exists(test2)
%if_exists(test3)
%if_exists(test4)
%if_exists(test5)
%if_exists(test6);
by i;
run;
答案 2 :(得分:0)
我可以想到两种选择:
用于创建空数据集的示例代码:
data want;
stop;
run;