日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > ChatGpt >内容正文

ChatGpt

SAS笔记(2) RETAIN语句

發(fā)布時(shí)間:2025/3/15 ChatGpt 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAS笔记(2) RETAIN语句 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文重點(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è)非缺失值即可:

DATA WITHOUT_2;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 ;

遺憾的是這段代碼并沒(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ǔ)句的作用:

  • 不需要顯示地用“=”賦值
  • 不需要顯示地初始化SUBJECT,它會(huì)自動(dòng)初始化為0
  • 不需要顯示地RETAIN,它會(huì)自動(dòng)RETAIN變量
  • 其實(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。