2

我想将“ondays”变量中的一些观察值分配到新值之下,这些值取决于变量“失败”是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=,它将具有与 ONDAYS 中相同的值1,但如果 FAILURE=0,NEWDAYS 将等于与 ONDAYS 中的 FAILURE=1 值对应的最接近(较低的值)。例如,在 NEWDAYS 观察 1 将等于 59,但观察 6 将等于 66(因为最接近 71 的有序“failure=1”值是 66)。你能帮我怎么做吗?

谢谢。

罗兰

4

1 回答 1

2

像这样?

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;

只需跟踪以前的 ONDAYS 并在需要时将其分配给新的 ONDAYS。

另一种选择: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;
于 2012-09-27T14:52:55.990 回答