4

我使用的数据集类似于:

+----------+--------+-------+
| 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 在第一行和 3d 行放置空白。它不必修改这一行,因为我说“如果变量 = .”。我知道如何在 Python 或 R 中使用一些 for 循环来做到这一点,但我在 SAS 中没有找到好的解决方案。

我试图将字符串放入带有“ CALL SYMPUT ”和“ RETAIN ”的变量中,但它也不起作用。

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

4

1 回答 1

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

于 2013-05-07T14:24:21.400 回答