我使用的数据集类似于:
+----------+--------+-------+
| 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 ”的变量中,但它也不起作用。
必须有一种简单而优雅的方式来做到这一点。任何想法?