仅在存在数据集的情况下进行合并

时间:2019-06-18 12:59:14

标签: merge sas

因此,我试图在sas中创建一个宏,并且试图在一个数据步骤中合并多个数据集。该宏还动态创建了各种不同的数据集,因此我不知道将要创建哪些数据集,哪些将不创建。我试图在一个数据步骤中合并四个数据集,并且试图仅合并存在的数据集,而不合并不存在的数据集。

除了在尝试做的事情外,还没有尝试过其他任何事情。

DATA Something;
    MERGE Something SomethingElse AnotherThing EXIST(YetAnotherThing)*YetAnotherThing;
RUN;

很明显这是行不通的,因为SAS不能那样工作,但是我正在尝试做类似的事情,其中​​YetAnotherThing是我正在测试的数据集之一,以查看它是否存在并合并如果有的话,它会发送给某事。

3 个答案:

答案 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)

我可以想到两种选择:

  1. 浏览输入数据列表,检查每个数据集是否存在,然后仅合并那些输入数据集。
  2. 在宏的开头,有条件地创建每个可能的输入数据集之前,请创建一个虚拟名称相同的虚拟数据集,其中不包含行或列。然后,当您尝试将它们合并时,它们将一直存在,而不会因大量缺失值而使输出混乱。

用于创建空数据集的示例代码:

data want;
stop;
run;