我正在使用的数据集类似于:
+----------+--------+-------+
| Variable | Level | Value |
+----------+--------+-------+
| sexe | men | 10 |
| | female | 20 |
| age | 0-20 | 5 |
| | 20-40 | 5 |
| | 40-60 | 10 |
| | >60 | 10 |
+----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
我想使用之前的非空白单元来完成"空白"单元格来获得这样的东西.
+----------+--------+-------+
| Variable | Level | Value |
+----------+--------+-------+
| sexe | men | 10 |
| sexe | female | 20 |
| age | 0-20 | 5 |
| age | 20-40 | 5 |
| age | 40-60 | 10 |
| age | >60 | 10 |
+----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
我在DATA步骤中尝试了各种可能性,主要是使用LAG()函数.想法是在单元格为空时读取前一行并填充该行.
DATA test;
SET test;
IF variable = . THEN DO;
variable = LAG1(variable);
END;
RUN;
Run Code Online (Sandbox Code Playgroud)
而我获得了
+----------+--------+-------+
| Variable | Level | Value |
+----------+--------+-------+
| | men | 10 |
| sexe | female | 20 |
| | 0-20 | 5 |
| age | 20-40 | 5 |
| | 40-60 | 10 |
| | >60 | 10 |
+----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
问题是好的字符串并不总是只有一行.但我不明白为什么SAS在第一行和第三行中留空.它没有必要修改这一行,因为我说"If variable =.".我知道如何在Python或R中使用一些for循环来做这个,但我没有在SAS中找到好的解决方案.
我试着将字符串放在一个带有" CALL SYMPUT "和" RETAIN " 的变量中,但它也不起作用.
必须有一个简单而优雅的方法来做到这一点.任何的想法?
Joe*_*Joe 17
你不能在IF中使用LAG并获得结果--LAG实际上并不像你想象的那样工作.保留是我说的正确方法:
DATA test;
SET test;
retain _variable;
if not missing(variable) then _variable=variable;
else variable=_variable;
drop _variable;
RUN;
Run Code Online (Sandbox Code Playgroud)
滞后实际上没有达到之前的记录并获得其价值; 它的作用是建立一个队列,每次调用LAG时,它从前面取下一条记录并在后面添加一条记录.这意味着如果LAG位于条件块内,则它不会针对false条件执行,并且您不会获得队列.您可以使用IFN和IFC函数,无论布尔值如何,它都会评估true和false条件,但在这种情况下RETAIN可能更容易.