如何在SAS中为DATA MERGE编写灵活的编号表列表?

时间:2015-10-09 14:53:41

标签: merge macros sas proc

我有一个程序应该合并连续编号的任意数量的表。我试图使用宏变量但无济于事。错误"缺少编号数据集列表中的数字后缀"不断涌现。

以下是有缺陷的代码:

DATA INPUTF;
  INPUT DSN $;
  CARDS;
  forum1
  forum2
  forum3
  ;
RUN;

DATA forum1;
  INPUT contact $ forum1 $;
  CARDS;
  Mash HERE
  Greg HERE
  Bob HERE
  ;
PROC SORT DATA=forum1;
  BY contact;
RUN;

DATA forum2;
  INPUT contact $ forum2 $;
  CARDS;
  Mash HERE
  Sid HERE
  Bob HERE
  ;
RUN;
PROC SORT DATA=forum2;
  BY contact;
RUN;

DATA forum3;
  INPUT contact $ forum3 $;
  CARDS;
  Mash HERE
  Sid HERE
  Jim HERE
  ;
RUN;
PROC SORT DATA=forum3;
  BY contact;
RUN;

PROC SQL NOPRINT;
  SELECT COUNT(*) INTO :n FROM INPUTF;
QUIT;

%MACRO COMBINE(N);
  DATA ALLIN;
    MERGE forum1-forum&n.;
    BY contact;
  RUN;
%MEND COMBINE;

%COMBINE;

PROC PRINT DATA=ALLIN;

但是,当我使用%LET语句时,代码工作正常,如下所示:

%let n=3;
DATA ALLIN;
  MERGE forum1-forum&n.;
  BY contact;
RUN;

PROC PRINT DATA=ALLIN;

问题是我不知道有多少个论坛,我更喜欢这个数字基于输入文件。

任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:1)

宏变量范围。

您已创建了全局表中存在的宏变量N。创建宏时,它会带一个参数,也称为N,它是本地的,未定义的,因为您没有传递有效参数。

使用创建的参数N调用宏,或将proc SQL移动到宏中。

%COMBINE(&N);

OR

%MACRO COMBINE;
PROC SQL NOPRINT;
SELECT COUNT(*) INTO :n FROM INPUTF;
QUIT;


DATA ALLIN;
MERGE forum1-forum&n.;
BY contact;
RUN;

%MEND COMBINE;

%COMBINE;

OR

如果您只有以FORUM开头的表,那么您尝试合并:

DATA ALLIN;
MERGE FORUM: ;
BY contact;
RUN;

答案 1 :(得分:0)

因此,如果数据集InputF具有要合并的数据集列表,则将该列表放入宏变量中。如果您始终至少有两个数据集,则不需要宏逻辑。

proc sql noprint ;
  select dsn into :dsnlist separated by ' '
  from inputf;
quit;

data allin;
  merge &dsnlist ;
  by contact;
run;

要处理列表中包含0或1个数据集名称的情况,您需要添加宏逻辑。当只有一个时,你需要使用SET而不是MERGE。您可以使用IFC()函数处理它。

data allin;
  %sysfunc(ifc(1=&sqlobs,set,merge)) &dsnlist ;
  by contact;
run;