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

用以前的非空白值SAS 9.3填充变量的空白值,sas,Sas,我使用的数据集类似于: +----------+--------+-------+ | Variable | Level | Value | +----------+--------+-------+ | sexe | men | 10 | | | female | 20 | | age | 0-20 | 5 | | | 20-40 | 5 | | | 40-60 | 10

我使用的数据集类似于:

+----------+--------+-------+
| 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 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在第一行和第三行都是空白的。它不必修改这一行,因为我说了“If variable=”。 我知道如何在Python或R中使用一些for循环实现这一点,但我在SAS中没有找到好的解决方案

我试图将字符串放在一个带“”的变量中,同时也放在带“”的变量中,但它不起作用


必须有一个简单而优雅的方法来做到这一点。有什么想法吗

你不能在IF中使用LAG并得到结果-LAG实际上并不是你所想的那样工作。保留是我说的正确方式:

DATA test;
   SET test;
   retain _variable;
   if not missing(variable) then _variable=variable;
   else variable=_variable;
   drop _variable;
RUN;

Lag实际上并没有进入前一条记录并得到它的值;它所做的是建立一个队列,每一个时间延迟都被称为从前端删除一条记录,并在后端添加一条记录。这意味着,如果LAG在条件块内,它将不会针对false条件执行,并且您不会获得队列。您可以使用IFN和IFC函数,无论布尔值是多少,它们都可以计算真条件和假条件,但在这种情况下,RETAIN可能更容易。

工作得很好,解释也很清楚!非常感谢你,乔!这是你第二次这么快地帮助我。你是怎么做到的?通过RSS跟踪所有问题?RSS实际上更新速度非常慢(但是,是的,在某些情况下);在我回答另一个问题后不久,你碰巧问了这个问题:)有用的答案。非常感谢。FWIW,我认为在单独的步骤中替换变量是个好主意。这样做可以使过程更加透明。这使得验证数据更容易,尤其是当不太熟悉SAS的人正在检查数据时。我会把
变量
作为
原始变量
引入。然后做
数据测试;集合测试;保留变量;如果不缺少(_raw_变量),则变量=_raw_变量;运行当您这样做时,您会得到一个填充值的列以及一个空白的列。抽查变得微不足道。然后,在以后的某个时候,您可以删除“原始”变量。这是一个有用的问题。谢谢。