sas - 需要改变之前的值

标签 sas

假设我们有以下数据集

obs    check   result
---------------------
aa     0       0
bb     0       0
cc     1       0
dd     0       0
ee     1       1 
ff     1       1 <- we are here. Due to prev. value both eq 1 the "result" variable for both of them should also be 1

我需要的是检查连续“check”变量中的 2 个或多个情况是否等于 1,如果是,则它们的“result”变量也应该为 1。问题是唯一的方法我发现将它们两个的“结果”设置为 1 就是以某种方式返回到上一个“观察到的行”并将那里的“结果”变量也更改为 1。

最佳答案

由于数据步骤循环的设计方式,我认为我们不能那么容易地返回到之前的观察结果。但是,我们可以使用 retain声明和 merge数据集本身 without一个by用于访问上一个或下一个观察结果的语句:

data work.sample;
    input obs $ check result;
    retain x;
    output;
    x = check;
    datalines;
    aa     0       0 
    bb     0       0
    cc     1       0
    dd     0       0
    ee     1       0 
    ff     1       0
    ;
run;

data work.sample2;
    merge work.sample
    work.sample(firstobs = 2 keep = check 
    rename = (check = c));
    if (check = 1 and x = 1) or (check = 1 and c = 1) then result = 1; 
run;

输出看起来像这样:

                      Obs    obs    check    result    x    c

                       1     aa       0         0      .    0
                       2     bb       0         0      0    1
                       3     cc       1         0      0    0
                       4     dd       0         0      1    1
                       5     ee       1         1      0    1
                       6     ff       1         1      1    .

因此,变量 x 表示使用 retain 保留的值声明和 output陈述。变量 c 表示我们在观察 = 2 时开始将数据集与其自身合并时创建的变量。

最后,如果连续出现 check = 1,我们将使用条件语句将新值放入结果变量中。

关于sas - 需要改变之前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348231/

相关文章:

input - 避免SAS错误消息: "NOTE: Invalid argument to function INPUT"

sas - 如何在 SAS 中获取 PROC REPORT 以显示没有观察的 ACROSS 变量中的值?

宏变量中的 SAS 分号

csv - 在 SAS 中导入具有较长不同长度字段的 CSV 会浪费磁盘空间

arrays - 将 SAS 中的结果限制为 [-1,1]

sas宏&符

SAS 宏,将值作为字符串传递给 where 子句

sql - union all对应和outer union对应有什么区别?

mysql - 引用其他表查看日期范围内的记录

active-directory - ldaps_search 超出了 LDAP 服务器大小限制 ( MSAD )