在sas中替换观测值

在sas中替换观测值,sas,Sas,我想将“ondays”变量中的一些观察值分配到新值下面,这些值取决于变量“failure”是0还是1。这是我的数据集 ID X ONDAYS FAILURE 1 0 59 1 2 0 514 1 3 0 313 0 4 0 631

我想将“ondays”变量中的一些观察值分配到新值下面,这些值取决于变量“failure”是0还是1。这是我的数据集

    ID         X       ONDAYS       FAILURE
    1          0         59          1
    2          0        514          1
    3          0        313          0
    4          0        631          1
    5          0        107          1
    6          0         71          0
    7          0        583          1
    8          0         91          1
    9          0         66          1
   10          0         95          0
我的目标是对ONDAYS进行排序——从最低到最高(我可以这么做)——对ONDAYS中的值进行排序,然后创建一个名为“NEWDAYS”的新变量,如果FAILURE=1,该变量的值将与ONDAYS中的值相同,但如果FAILURE=0,则NEWDAYS将等于与ONDAYS中FAILURE=1值对应的最近值(较低值)。 例如,在NEWDAYS中,观察值1将等于59,但观察值6将等于66(因为与71最接近的有序“failure=1”值为66)。 你能帮我怎么做吗

谢谢

罗兰是这样的吗

data have;
input ID         X       ONDAYS       FAILURE;
datalines;
    1          0         59          1
    2          0        514          1
    3          0        313          0
    4          0        631          1
    5          0        107          1
    6          0         71          0
    7          0        583          1
    8          0         91          1
    9          0         66          1
   10          0         95          0
   ;;;;
run;
proc sort data=have;
by ondays;
run;
data want;
set have;
by ondays;
retain prev_ondays;
if failure=0 then new_ondays=prev_ondays;
else new_ondays=ondays;
output;
prev_ondays=new_ondays;
run;
只需记录以前的星期一,如果需要,将其分配给新的星期一

另一种选择:SQL。这将更新当前表,这可能是需要的,也可能不是;如果没有,请创建一个新表并应用该表

proc sql undopolicy=none;
update have H set ondays=(select max(ondays) from have V where H.ondays ge V.ondays and V.failure=1)
where failure=0;
quit;

很好的解决方案,但是,我认为您希望将“prev_ondays=ondays;”更改为“如果失败=1,那么prev_ondays=ondays;”……以防您连续记录失败=0Nope。这是由执行时间来处理的——正如我已经将ONDAYS更改为先前的ONDAYS值一样,新的PREV_ONDAYS仍然是所需的值(两行、三行或任何行之前)。这就是为什么我不使用LAG的原因——除了不合理地讨厌LAG之外——在未知数量的行中管理RETAIN变量更容易。你是对的……如果我用额外的输入数据对它进行了测试,就可以看出这一点。这个问题确实要求将newdays作为一个额外的var,而不是改变ondays,但是您的数据步解决方案确实可以跨任意数量的变量工作obs@CarolinaJay65这几乎是我想要的。唯一的问题是变量PREV_______________________________。(缺少值),因此剩余值向下移动。现在,我在观察2中看到了我对观察1和forthAlso的预期,因为我不习惯处理sql,我不知道如何使用proc print来查看第二个选项的结果(很抱歉我在SAS中的局限性)