做SDTM算AEDY, LBDY, MHDY等等--DY变量时,可参考以下一看就明白的方法。
计算方法:
If --DTC>=SDTM.DM.RFSTDTC then --DY=(date portion of --DTC) - (date portion of DM.RFSTDTC) + 1;
else --DY=(date portion of --DTC) - (date portion of DM.RFSTDTC)
Notes: --DTC can be used as --DTC, --STDTC, --ENDTC, "--" indicates domain
---------以下是参考SAS代码--------------------------------
*domain: sdtm的域名
indsn: 要处理的数据集
indtc:要处理的数据集中的dtc变量
prefix:st或en或空
outdsn:已加上计算好的--dy的数据集;
%macro sdtm_dy(domain=,indtc=, indsn=, prefix=, outdsn=);
/*取sdtm.dm中的rfstdtc和rfendtc,算出其数值型,便于后面加减。*/
data dm;
set sdtm.dm;
format rfstdt rfendt e8601da10.;
if length(rfstdtc)>=10 then rfstdt=input(substr(rfstdtc,1,10),e8601da10.);
if length(rfendtc)>=10 then rfendt=input(substr(rfendtc,1,10),e8601da10.);
keep usubjid rfstdt rfendt;
run;
/*为和dm merge,对要处理的数据集按usubjid排序。*/
proc sort data=&indsn.;
by usubjid;
run;
/*合并dm和要处理的数据集,得到有xxdy变量的数据集*/
data &outdsn.;
length &domain.&prefix.dy &prefix.dt 8.;
merge dm(in=b) &indsn.(in=a);
by usubjid;
if a & b;
/*合并同时在dm和要处理的数据集中的usubjid的观测*/
if &indtc.='' then &indtc.='';
format &prefix.dt e8601da10.;
if length(&indtc.)>=10 then do;
&prefix.dt=input(substr(&indtc.,1,10),??yymmdd10.);
/*算出--dtc变量的数值型:&prefix.dt*/
if nmiss(rfstdt,&prefix.dt)=0 then &domain.&prefix.dy=&prefix.dt-rfstdt+(&prefix.dt>=rfstdt);
/*当rfstdtc的数值型rfstdt和--dtc变量的数值型无缺失时,计算--dy变量*/
end;
drop rfstdt rfendt;
run;
%mend sdtm_dy;
----- code end----------------------