今日学习dm domain中的rfpendtc变量。该变量是参与活动结束日期/时间,spec中标注为受试者结束参与或随访的日期/时间(对应于任何特殊目的和一般观察类中可用的最后日期/时间)。那么在编程时就应该遍历所有原始数据集找到事件的时间变量,然后再排序选取最晚的时间。
我的理解是做这个变量分为3步考虑。
第一步:找到数据集中含有DAT的变量,一般用DAT的字符型,所以这里找到含DAT_RAW的变量。那么首先就将原始数据集中所有变量列出来,再选择我们想要的日期变量。
proc contents data=raw._all_ out=all noprint;
run;
proc sql noprint;
create table dat as
select * from all
where name like '%DAT_RAW';
quit;
第二步:使用宏将上一步筛选出的数据集中的日期变量转换成is8601的格式。这里需要注意的一点是某些数据集中的日期可能含有“UNK”这样的表达,需将这些观测排除在外。首先将我们要用的数据集及其中的日期变量做成宏变量。
proc sql noprint;
select memname into :m1-:m99 from dat;/*原始数据集宏变量*/
select name into :n1-:n99 from dat;/*对应数据集中的日期变量的宏变量*/
quit;
%put _user_;
%macro date;
%do i =1 %to 46;
data date_&i;
length dtc $20.;
set raw.&&m&i;
if not index(&&n&i,"UN") and not index(&&n&i,"un") and not index(&&n&i,"Un") then dtc=put(input(&&n&i,date11.),yymmdd10.);
keep subject dtc;
%end;
%mend;
%date;
以上就将所有的日期筛选出来了,下面就是将数据集set到一起。
data rfp;
set date:;
where dtc ne "";
run;
第三步:数据集排序后,去最后一条,就得到了时间的最后值了。
proc sort data=rfp;
by subject dtc;
run;
data rfp1;
set rfp;
by subject dtc;
if last.subject;
run;
我的思路和编程过程是这样的,不知道还有什么更好的思路和方法没有。