我刚刚完成了我正在进行的项目的主宏。它生成一行以输入另一个表。因此,我的下一步是编写另一个调用该宏的宏。下一个宏的参数之一是要在其中插入新观测值的数据集的名称,这引出了我的问题...
我想让我的下一个宏检查并查看命名数据集是否存在。如果是这样,它将把新计算的线插入到数据集中。如果还不存在,我想用该名称将新行另存为数据集。
为了更具体一点,让我们假设我有宏 %calculate_for(ARG1,ARG2,ARG3)创建一个单观测数据集NEXT_LINE。我想编写一个类似以下内容的宏:
%macro do_for(ARG1, ARG2, ARG3, DATASET_NAME);
%calculate_for(&ARG1, &ARG2, &ARG3)
{if DATASET_NAME exists then do:}
data &DATASET_NAME;
set &DATASET_NAME
NEXT_LINE;
run;
{if DATASET_NAME doesn't exist yet then do:}
data &DATASET_NAME;
set NEXT_LINE;
run;
%mend;
我该如何在SAS中做到这一点?
答案 0 :(得分:2)
宏函数%SYSFUNC
可用于调用几乎所有DATA步骤函数。
例如
%macro …;
data &out;
set
%if %sysfunc (EXIST(&OUT,DATA)) %then %do;
&OUT
%end;
NEXT_LINE;
;
run;
%mend;
同样,%SYSCALL
例程可用于调用几乎所有CALL例程。
正如@Reeza所说,对于您问题中的特定编码情况,Proc APPEND
可能是更好的选择。示例代码中显示的模式将导致基本表的整个重写。
其他不重写整个数据集的编码模式包括
MODIFY
条语句,后接OUTPUT
,REPLACE
或REMOVE
条语句INSERT INTO
…SELECT … FROM
如果您要进行大量开发,也许不要在每一步都重新创建轮子。看看具有通用实用程序功能的SAS宏库,其中一个示例Roland's SAS® Macros