SAS SET多表后跟条件判断语句的逻辑
data aa;
do subjid=1 to 5;
do visit=1 to 5;
trt='out';
output;
end;
end;
run;
data aa2;
do subjid=1 to 3;
visit=6;trt1='pho';
output;
end;
subjid=4;
visit=6;trt1='aa';
output;
subjid=5;
visit=6;trt1='mis';
output;
run;
data aa3;
set aa aa2 ;
if trt='' then do;trt=trt1;num=_n_;end;
do subjid=1 to 5;
do visit=1 to 5;
trt='out';
output;
end;
end;
run;
data aa2;
do subjid=1 to 3;
visit=6;trt1='pho';
output;
end;
subjid=4;
visit=6;trt1='aa';
output;
subjid=5;
visit=6;trt1='mis';
output;
run;
data aa3;
set aa aa2 ;
if trt='' then do;trt=trt1;num=_n_;end;
run;
程序如上,问题是aa3中,期望trt为空时赋trt1的值,但实际应用中会只赋aa2的第一行的trt1的值。
解决方法也有,就是在data aa3 步,set后加by subjid visit;或者另起一data步进行if。
但我并不清楚详细原理,希望各位老师帮忙
解决方法也有,就是在data aa3 步,set后加by subjid visit;或者另起一data步进行if。
但我并不清楚详细原理,希望各位老师帮忙
解决方案:
因为PDV的机制是,每次迭代只处理一个观测,而每次迭代对于内部数据集原有变量值保持(迭代时未缺失则进行替换,否则保留原值),新生成变量值清空(迭代时通过data step指定的生成方式生成)。
本例中,trt属于原有变量,故在下一次迭代时,若trt未缺失,则进行替换,缺失则保持原有值:pho。所以除了第一个观测外的其它观测都不满足trt=" "。 但是若把下列code if语句中的trt换成新变量trt2,对于trt=" "的观测,trt2的取值就等都于trt1了
本例中,trt属于原有变量,故在下一次迭代时,若trt未缺失,则进行替换,缺失则保持原有值:pho。所以除了第一个观测外的其它观测都不满足trt=" "。 但是若把下列code if语句中的trt换成新变量trt2,对于trt=" "的观测,trt2的取值就等都于trt1了
data aa3;
set aa aa2 ;
put "--Before " _all_ ;
if trt='' then do;trt=trt1;num=_n_;end;
put "--after " _all_ ;
run;
data aa3;
set aa aa2 ;
put "--Before " _all_ ;
if trt='' then do;trt2=trt1;num=_n_;end;/*trt改trt2*/
put "--after " _all_ ;
run;
set aa aa2 ;
put "--Before " _all_ ;
if trt='' then do;trt=trt1;num=_n_;end;
put "--after " _all_ ;
run;
data aa3;
set aa aa2 ;
put "--Before " _all_ ;
if trt='' then do;trt2=trt1;num=_n_;end;/*trt改trt2*/
put "--after " _all_ ;
run;