如何在SAS数据步的SET语句中为数据集添加来源标识变量?
问题:SAS合并多文件时添加来源标识变量
我有一段用%do循环构建SET语句合并多文件的SAS数据步代码,文件命名格式为datafileYYYYqQ(比如datafile2020q1、datafile2021q3),存储在DataLibraryYYYY类别的库中,现有宏代码如下:
%macro processclaimsdata; data rawclaimsdata (keep=&claimvariables.); set %do yr=2019 %to 2021; %do qrtr=1 %to 4; DataLibrary&yr..datafile&yr.q&qrtr. (keep=&claimvariables.) %end; %end; ; run; %mend;
我想给输出数据集添加一个格式为YYYYqQ(如2020q1、2021q3)的变量,用来追踪每条数据的来源文件。请问能否修改现有代码实现这个需求,还是必须改用proc append或proc sql?
解答
完全可以直接修改现有数据步代码实现需求,不需要切换到proc append或proc sql,两种简单的修改方式如下:
方式1:利用in=标记变量赋值
通过in=选项为每个数据集生成一个标记变量,再根据标记为来源变量赋值:
%macro processclaimsdata; data rawclaimsdata (keep=&claimvariables. source_file); set %do yr=2019 %to 2021; %do qrtr=1 %to 4; DataLibrary&yr..datafile&yr.q&qrtr. (keep=&claimvariables. in=in_&yr.&qrtr.) %end; %end; ; /* 根据每个数据集的in标记,设置来源变量 */ %do yr=2019 %to 2021; %do qrtr=1 %to 4; if in_&yr.&qrtr. then source_file = "&yr.q&qrtr."; %end; %end; run; %mend;
方式2:直接在SET列表中穿插赋值(更简洁)
SAS支持在SET语句的数据集列表中直接穿插变量赋值,读取对应数据集的每条观测时会自动执行赋值:
%macro processclaimsdata; data rawclaimsdata (keep=&claimvariables. source_file); set %do yr=2019 %to 2021; %do qrtr=1 %to 4; DataLibrary&yr..datafile&yr.q&qrtr. (keep=&claimvariables.) source_file = "&yr.q&qrtr." %end; %end; ; run; %mend;
这种写法无需额外的判断逻辑,代码更紧凑,效果和方式1完全一致。
内容的提问来源于stack exchange,提问作者Michael A
相关产品推荐
相关产品推荐

