? ? ? ? 今日學(xué)習(xí)dm domain中的rfpendtc變量。該變量是參與活動(dòng)結(jié)束日期/時(shí)間,spec中標(biāo)注為受試者結(jié)束參與或隨訪的日期/時(shí)間(對應(yīng)于任何特殊目的和一般觀察類中可用的最后日期/時(shí)間)。那么在編程時(shí)就應(yīng)該遍歷所有原始數(shù)據(jù)集找到事件的時(shí)間變量,然后再排序選取最晚的時(shí)間。
? ? ? ? 我的理解是做這個(gè)變量分為3步考慮。
? ? ? ? 第一步:找到數(shù)據(jù)集中含有DAT的變量,一般用DAT的字符型,所以這里找到含DAT_RAW的變量。那么首先就將原始數(shù)據(jù)集中所有變量列出來,再選擇我們想要的日期變量。
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;
第二步:使用宏將上一步篩選出的數(shù)據(jù)集中的日期變量轉(zhuǎn)換成is8601的格式。這里需要注意的一點(diǎn)是某些數(shù)據(jù)集中的日期可能含有“UNK”這樣的表達(dá),需將這些觀測排除在外。首先將我們要用的數(shù)據(jù)集及其中的日期變量做成宏變量。
proc sql noprint;
????select memname into :m1-:m99 from dat;/*原始數(shù)據(jù)集宏變量*/
????select name into :n1-:n99 from dat;/*對應(yīng)數(shù)據(jù)集中的日期變量的宏變量*/
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;
以上就將所有的日期篩選出來了,下面就是將數(shù)據(jù)集set到一起。
data rfp;
????set date:;
????where dtc ne "";
run;
第三步:數(shù)據(jù)集排序后,去最后一條,就得到了時(shí)間的最后值了。
proc sort data=rfp;
????by subject dtc;
run;
data rfp1;
????set rfp;
????by subject dtc;
????if last.subject;
run;
我的思路和編程過程是這樣的,不知道還有什么更好的思路和方法沒有。