用以前的非空白值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_变量;运行代码>当您这样做时,您会得到一个填充值的列以及一个空白的列。抽查变得微不足道。然后,在以后的某个时候,您可以删除“原始”变量。这是一个有用的问题。谢谢。