在DATA STEP中基于源表附加变量

时间:2014-08-20 15:10:55

标签: sas datastep

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

一个简单示例可能&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创建的表)

1 个答案:

答案 0 :(得分: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;

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