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

jom*_*ler 4 sas

我正在使用的数据集类似于:

+----------+--------+-------+
| 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可能更容易.