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+上,有一个非常简单的解决方案。