使用先前的非空白值SAS 9.3填充变量的空白值

时间:2013-05-07 14:18:53

标签: sas

我使用的数据集类似于:

+----------+--------+-------+
| 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 |
+----------+--------+-------+

我在DATA步骤中尝试了各种可能性,主要是使用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"但它也没有用。

必须有一种简单而优雅的方式来做到这一点。任何的想法?

1 个答案:

答案 0 :(得分:17)

你不能在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时,它从前面取下一条记录并在后面添加一条记录。这意味着如果LAG位于条件块内,则它不会针对false条件执行,并且您不会获得队列。您可以使用IFN和IFC函数,它们无论布尔值如何都会评估true和false条件,但在这种情况下RETAIN可能更容易。