SAS數(shù)據(jù)集排序后骤视,對于每一個(gè)排序變量鞍爱,數(shù)據(jù)集自帶兩個(gè)臨時(shí)變量(Temporary Variable),F(xiàn)irst.Var专酗,Last.Var睹逃。這兩個(gè)臨時(shí)變量指示數(shù)據(jù)是否為組內(nèi)首行或尾行。我們來看個(gè)例子祷肯。
從結(jié)果中可以看到沉填,ONE數(shù)據(jù)集中按照SUBJECT排序后,F(xiàn)irst.subject=1表明記錄位于組內(nèi)首行佑笋;First.subject=0表明記錄不在組內(nèi)首行翼闹,Last.subject與前者類似。當(dāng)組內(nèi)只有一條觀測時(shí)蒋纬,這時(shí)候猎荠,F(xiàn)irst.subject和Last.subject同時(shí)為1。下面介紹一下蜀备,這兩個(gè)臨時(shí)變量的應(yīng)用关摇。
1.標(biāo)記陽性受試者
我們先創(chuàng)建一個(gè)測試數(shù)據(jù)集,這個(gè)數(shù)據(jù)集包含3個(gè)變量碾阁,patno(受試者編號)输虱、 visit_no(訪視編號)、 outcome(檢測結(jié)果)脂凶。
對于這樣結(jié)構(gòu)的數(shù)據(jù)悼瓮,我們想要找出有outcome=1記錄的受試者,如何實(shí)現(xiàn)呢艰猬?一種方法横堡,使用First./Last.。
數(shù)據(jù)集按照PATNO冠桃、VISIT_NO排序命贴,按照PATNO分組,新建一個(gè)FLAG變量來記錄是否為陽性結(jié)果食听。對于每一組胸蛛,首先將FLAG變量置空(if first.patno = 1 then flag = 0;
); 當(dāng)遇到記錄讀到陽性數(shù)據(jù)時(shí),F(xiàn)LAG設(shè)為1(if outcome = 1 then flag = 1;
樱报。因?yàn)檫@里的FLAG是Retain下來的葬项,所以當(dāng)FLAG設(shè)為1后,同一組內(nèi)的后續(xù)記錄為0后迹蛤,不會在進(jìn)行賦值民珍,一直保留為1襟士。當(dāng)讀到組內(nèi)最后一條記錄時(shí),將這條記錄輸出到數(shù)據(jù)集Flag_test中嚷量。這樣有"陽性結(jié)果"的患者就可以用FLAG=1來標(biāo)識了陋桂。
2.陽性記錄計(jì)數(shù)
上面的例子只是選出有陽性記錄的受試者編號,這樣無法知曉每個(gè)受試者具體的陽性記錄蝶溶。下面嗜历,我們實(shí)現(xiàn)組內(nèi)陽性記錄的計(jì)數(shù)。
首先抖所,在組內(nèi)首行將計(jì)數(shù)變量COUNT設(shè)為0梨州,每遇到陽性記錄計(jì)數(shù)就加1。count+1
相當(dāng)于retain count 1; count = count +1
田轧,當(dāng)遇到非陽性記錄時(shí)暴匠,條件語句不執(zhí)行,count值保留進(jìn)入下一行記錄的計(jì)算涯鲁,最后只保留組內(nèi)最后一條記錄。
***篩選陽性記錄;
data lab;
input patno visit_no outcome;
datalines;
3 1 0
3 2 0
3 3 1
1 1 0
1 2 1
1 3 0
1 4 1
2 1 0
2 2 0
4 1 1
4 2 1
4 3 1
;
run;
proc sort data=lab;
by patno visit_no;
run;
data flag_test;
set lab;
by patno;
retain flag; ***if flag = 1 outcome was positive;
***initialize flag;
if first.patno = 1 then flag = 0;
***turn flag on if outcome is positive;
if outcome = 1 then flag = 1;
***output one observation when processing the last visit for a patient;
if last.patno = 1 then output;
drop outcome visit_no;
run;
proc print data=flag_test;
title "listing of data set flag_test";
run;
***計(jì)數(shù);
data count_test;
set lab;
by patno;
***initialize count;
if first.patno = 1 then count = 0;
***increment count if outcome is positive;
if outcome = 1 then count + 1;
***output one observation when processing the last visit for a patient;
if last.patno = 1 then output;
drop outcome;
run;
proc print data=count_test;
title "listing of data set count_test";
run;