SAS笔记(2) RETAIN语句
本文重點(diǎn):
- 使用RETIAN,INPUT在每次循環(huán)執(zhí)行時(shí)保留上一次PDV中的變量值。
- SUM語(yǔ)句和SET語(yǔ)句會(huì)自動(dòng)RETAIN變量。
1. RETAIN語(yǔ)句
1.1 Example 1
先來(lái)看看在DATA步不使用和使用RETAIN語(yǔ)句的差異
沒(méi)有使用RETAIN:
DATA WITHOUT_1;PUT "Before the INPUT statement: " _ALL_;INPUT X @@;PUT "After the INPUT statement: " _ALL_ /; DATALINES; 1 2 . 3 ;使用RETAIN:
DATA WITH_1;RETAIN X;PUT "Before the INPUT statement: " _ALL_;INPUT X @@;PUT "After the INPUT statement: " _ALL_ /; DATALINES; 1 2 . 3 ;注意比較兩段代碼的輸出紅色矩形的內(nèi)容,結(jié)合上一篇博客里講的PDV,不難發(fā)現(xiàn):
- 不使用RETAIN,INPUT在每次循環(huán)執(zhí)行時(shí)會(huì)把PDV中的變量值清空,即置為(.)。
- 使用RETIAN,INPUT在每次循環(huán)執(zhí)行時(shí)保留上一次PDV中的變量值。
實(shí)際上,上面這個(gè)例子里數(shù)據(jù)集WITHOUT_1和WITH_1的內(nèi)容是一樣的,下面來(lái)看一個(gè)必須要用RETAIN的例子。
1.2 Example 2
考慮這樣一種場(chǎng)景:我們的數(shù)據(jù)集中有缺失值,我們想用該缺失值的前一個(gè)非缺失值來(lái)填補(bǔ)該缺失值,比如我們的數(shù)據(jù)是1,2,.,3填補(bǔ)后是1,2,2,3。
這在SAS中很好處理,我們只需要用一個(gè)變量記住上一個(gè)非缺失值即可:
遺憾的是這段代碼并沒(méi)有實(shí)現(xiàn)我們的目的
查看日志,問(wèn)題就很明顯了,因?yàn)闆](méi)有使用RETAIN,所以在數(shù)據(jù)步的每一次循環(huán)開(kāi)始時(shí),PDV中的變量均被置空,所以O(shè)LD_X每一次都是空:
既然想讓OLD_X記住DATA步每次迭代的前一個(gè)值,我們RETAIN住OLD_X即可:
DATA WITH_2;RETAIN OLD_X;PUT "Before INPUT: " _ALL_ ;INPUT X @@;IF X NE . THEN OLD_X = X;ELSE X = OLD_X;PUT "After assignment: " _ALL_ /; DATALINES; 1 2 . 3 ;1.3 Example 3
考慮這樣一種場(chǎng)景:在我們讀入數(shù)據(jù)的時(shí)候,我們想給每個(gè)數(shù)據(jù)加一個(gè)順序的行號(hào),第一條觀測(cè)是1,第二條觀測(cè)是2,依次到最后一條觀測(cè)。
下面用RETAIN語(yǔ)句實(shí)現(xiàn):
DATA WITH_3;RETAIN SUBJECT 0;PUT "Before the INPUT statement: " _ALL_ ;INPUT X @@;SUBJECT = SUBJECT + 1;PUT "After the INPUT statement: " _ALL_ /; DATALINES; 1 3 5 ;RETAIN SUBJECT 0;表示在DATA步的每一次迭代時(shí)RETAIN住SUBJECT這個(gè)變量,不要將其置為空,“0”表示SUBJECT的初始值。
上面這段代碼,可以利用SAS中的SUM語(yǔ)句進(jìn)行簡(jiǎn)化:
DATA WITHOUT_4; PUT "Before the INPUT statement: " _ALL_ ; INPUT X @@; SUBJECT + 1; /* SUM statement */ PUT "After the INPUT statement: " _ALL_ /; DATALINES; 1 3 5 ;注意到SUM語(yǔ)句的作用:
其實(shí),如果你還記得上一篇博客中我們?cè)谥vPDV時(shí)提到的自動(dòng)變量_n_,這段代碼可以更簡(jiǎn)潔:
DATA USE_n_; PUT "Before the INPUT statement: " _ALL_ ; INPUT X @@; n = _n_; PUT "After the INPUT statement: " _ALL_ /; DATALINES; 1 3 5 ;1.4 Example4
上一個(gè)例子中我們發(fā)現(xiàn)SUM語(yǔ)句會(huì)自動(dòng)RETAIN變量,其實(shí)SAS中的SET語(yǔ)句也會(huì)自動(dòng)RETAIN變量:
DATA ONE;INPUT X Y; DATALINES; 1 2 ; DATA TWO;IF _N_ = 1 THEN SET ONE;PUT "Before INPUT statement: " _ALL_;INPUT NEW;PUT "After INPUT statement: " _ALL_ / ; DATALINES; 3 4 5 ;看一下日志,就發(fā)現(xiàn)SET的確自動(dòng)RETAIN了變量X,Y。最開(kāi)始,_N_=1,將X=1,Y=2讀入,然后_N_=2,_N_=3等后面的每一步,粉色框里的X,Y值并沒(méi)有在DATA步的每次迭代中被置空。
?
參考資料:《Longitudinal Data and SAS: A Programmer's Guide》
轉(zhuǎn)載于:https://www.cnblogs.com/zhangzhangwhu/p/7223163.html
總結(jié)
以上是生活随笔為你收集整理的SAS笔记(2) RETAIN语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux命令之乐--sed
- 下一篇: FAIL : SSHException: