2013-05-07 195 views
5

我使用的數據集是一樣的東西:填寫變量的空值與前一個非空值SAS 9.3

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
|   | female | 20 | 
| age  | 0-20 |  5 | 
|   | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

而且我想用以前的履行「空白」細胞非空白單元格來獲得這樣的東西。

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
| sexe  | female | 20 | 
| age  | 0-20 |  5 | 
| age  | 20-40 |  5 | 
| age  | 40-60 | 10 | 
| age  | >60 | 10 | 
+----------+--------+-------+ 

我試圖與LAG()功能主要是數據步的各種可能性。這個想法是當單元格是空的時候讀取前一行並填充它。

DATA test; 
    SET test; 

    IF variable = . THEN DO; 
     variable = LAG1(variable); 
    END; 
RUN; 

我獲得

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
|   | men | 10 | 
| sexe  | female | 20 | 
|   | 0-20 |  5 | 
| age  | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

的問題是很好的字符串不是永遠只是一列上。但我不明白爲什麼SAS在第一和第三行放空。它不必修改這一行,因爲我說「如果變量=。」。 我知道如何在Python或R中用一些for循環來做到這一點,但我在SAS中找不到好的解決方案。

我試圖把字符串放在一個變量「CALL SYMPUT」,還有「RETAIN」,但它沒有工作。

必須有一個簡單而優雅的方式來做到這一點。任何想法?

+0

有用的問題。非常感謝。 – stan 2014-05-10 13:48:59

回答

18

您不能在IF內使用LAG並獲得結果-LAG實際上並不按照您的想法工作。 RETAIN是正確的方法,我會說:

DATA test; 
    SET test; 
    retain _variable; 
    if not missing(variable) then _variable=variable; 
    else variable=_variable; 
    drop _variable; 
RUN; 

滯後實際上並沒有去以前的記錄,並得到其價值;它所做的就是設置一個隊列,每次調用LAG時,都會從前面取出一條記錄,並向後面添加一條記錄。這意味着如果LAG位於條件塊內部,則它不會針對錯誤條件執行,而且您不會獲得您的隊列。您可以使用IFN和IFC函數,這些函數可以評估true和false條件,而不考慮布爾值,但在這種情況下,RETAIN可能更容易。

+0

完美工作,解釋非常清晰!非常感謝喬!這是你第二次幫助我,這麼快。你最近怎麼樣?通過RSS跟蹤所有問題? – jomuller 2013-05-07 14:28:21

+0

RSS實際上很慢更新(但是,在某些情況下);你只是在我回答了另一個問題後不久就問它:) – Joe 2013-05-07 15:03:19

+0

有用的答案。非常感謝。 – stan 2014-05-10 13:47:48