我有一个像这样的数据集:
ID |时间|值
1 | 1 | 0
1 | 2 | 2
1 | 3 | 0
1 | 4 | 0.5
2 | 1 | 0
2 | 2 | 0
2 | 3 | 3
如果值> gt; 0然后我希望指标变量在该ID的所有后续时间为1,例如:
ID |时间|价值|指示器
1 | 1 | 0 | 0
1 | 2 | 2 | 1
1 | 3 | 0 | 1
1 | 4 | 0.5 | 1
2 | 1 | 0 | 0
2 | 2 | 0 | 0
2 | 3 | 3 | 1
我的实际数据集要大得多,有点复杂(有多个值/条件会导致指示符从0翻转到1)但它们都会在正确的时间翻转。我的问题是将这个正值级联到所有后续ID /事件。因此,如果值翻转为1并且随后的观察结果不是1,则它应该为1,而是指示符为0.它看起来像这样:
ID |时间|价值|指示器
1 | 1 | 0 | 0
1 | 2 | 2 | 1
1 | 3 | 0 | 0
1 | 4 | 0.5 | 0
2 | 1 | 0 | 0
2 | 2 | 0 | 0
2 | 3 | 3 | 1
这是我目前的代码:
DATA mydata;
SET mydata;
BY ID;
IF first.ID then indicator = 0;
else if lag1(indicator) = 1 then indicator=1;
RUN;
我认为这只会查找一个并查看之前的值是否为1.如果是,则将该指标设置为1.然后下一行将查找指示符为1且该行将变为1好。
答案 0 :(得分:2)
您可以使用retain
语句并检查值。 retain indicator;
会将指标的值从datastep的一次迭代保留到下一次。
DATA mydata;
SET mydata;
RETAIN indicator ;
BY ID;
IF first.ID then indicator = 0;
IF value > 0 then indicator = 1;
RUN;