1

我将存在于不同表中的几个数据快照堆叠在一起。以下代码迭代大量带日期戳的快照并提取键值对。&InVar.有没有一种简单的方法可以在这个 DATA STEP中附加宏变量的值?

一个简单的示例可能具有&channels.20140106 20140120 20140127&nchannels.3

DATA kv_map;
    SET
        %DO q=1 %TO &nchannels;
        %LET InVar=%SCAN(&channels,&q);
        %PUT &InVar;
            sourcedata.datasnapshot_&InVar.(keep=var_key var_value)
        %END;
    ;
RUN;

输出将是:

kv_map

╔══════════╦═════════╦════════════╗
║ var_key  ║ var_map ║  provenace ║
╠══════════╬═════════╬════════════╣
║ aaa      ║     123 ║   20140106 ║
║ bbb      ║     432 ║   20140106 ║
║ ccc      ║     313 ║   20140106 ║
║ fff      ║     654 ║   20140120 ║
║ ggg      ║     125 ║   20140120 ║
║ iii      ║     843 ║   20140120 ║
║ jjj      ║     864 ║   20140127 ║
╚══════════╩═════════╩════════════╝

(使用http://goo.gl/JIeqZ创建的表)

4

1 回答 1

1

对于任何版本,您都可以这样编写:

DATA kv_map;
    SET
        %DO q=1 %TO &nchannels;
        %LET InVar=%SCAN(&channels,&q);
        %PUT &InVar;
            sourcedata.datasnapshot_&InVar.(keep=var_key var_value in=_in_&invar.)
        %END;
    ;
    array ins _in_:;
    do _i = 1 to dim(ins);
      if ins[_i] then provenance=vname(ins[_i]);
    end;
RUN;

对于 SAS 9.3+,有一种更简单的方法。

DATA kv_map;
    SET
        %DO q=1 %TO &nchannels;
        %LET InVar=%SCAN(&channels,&q);
        %PUT &InVar;
            sourcedata.datasnapshot_&InVar.(keep=var_key var_value )
        %END;
        indsname=_provenance 
    ;
    provenance=_provenance; *the indsname variable will not be kept, so you need to assign to a different one;
RUN;

现在,我会做一些不同的事情,以使其更容易阅读。通常,如果您可以将宏内容移动到单独的宏中,则可以简化阅读代码。

%macro source_data(nchannels=,channels=);
              %DO q=1 %TO &nchannels;
            %LET InVar=%SCAN(&channels,&q);
            %PUT &InVar;
                sourcedata.datasnapshot_&InVar.(keep=var_key var_value)
            %END;
%mend source_data;   *and of course you can add another parameter for libname or datasetname if that might vary also;

data kv_map;
  set %source_data(nchannels=3,channels=20140106 20140120 20140127);
run;

宏可以在较早的位置定义(可能定义其他宏的位置),因此只要您在逻辑上命名它,它会使您的数据步骤代码更易于阅读。

于 2014-08-20T15:16:25.133 回答