我使用的数据集类似于:
+----------+--------+-------+
| 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"但它也没有用。
必须有一种简单而优雅的方式来做到这一点。任何的想法?
答案 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可能更容易。