Sas 基于数据步骤中的源表附加变量

Sas 基于数据步骤中的源表附加变量,sas,datastep,Sas,Datastep,我将存在于不同表中的几个数据快照堆叠在一起。下面的代码迭代大量已盖销快照并提取键值对。是否有一种简单的方法可以在此数据步骤中附加宏变量&InVar.的值 一个简单的示例可能有频道。的值为20140106 20140120 20140127和频道。的值为3 DATA kv_map; SET %DO q=1 %TO &nchannels; %LET InVar=%SCAN(&channels,&q); %PUT &

我将存在于不同表中的几个数据快照堆叠在一起。下面的代码迭代大量已盖销快照并提取键值对。是否有一种简单的方法可以在此数据步骤中附加宏变量
&InVar.
的值

一个简单的示例可能有
频道。
的值为
20140106 20140120 20140127
频道。
的值为
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\u地图

╔══════════╦═════════╦════════════╗
║ 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 ║
╚══════════╩═════════╩════════════╝

(使用创建的表)

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

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;

宏可以在更早的点定义(其他宏可以被定义),所以只要你逻辑地命名它,它就可以使你的数据步进代码更容易阅读。

这似乎不起作用。我想你已经在“代码>集合SET/COMPUTE语句-<代码>的中间注入了任务。<倒数第二行的code>是
SET
语句的结尾。哎呀,你完全正确。更新。(这就是为什么我不会这样做,事实上,我现在正在更新这个问题)。新的更新将
&InVar.
的最终值附加到所有记录上。它不会这样做。在培训期间回答问题=坏主意。请稍等。您使用的是哪个SAS版本?如果你在9.3+上,有一个非常简单的解决方案。