假设我们有以下数据集
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/