我在这样的SAS中有一个日志数据集,它已经被TimeStamp上升了
TimeStamp Status
2015Dec01:1:00:00 1
2015Dec01:2:00:00 2
2015Dec01:3:00:00 3
2015Dec01:4:00:00 4
2015Dec01:5:00:00 1
2015Dec01:6:00:00 2
2015Dec01:7:00:00 2
2015Dec01:8:00:00 4
2015Dec01:9:00:00 5
2015Dec01:10:00:00 1
2015Dec01:11:00:00 3
2015Dec01:11:30:00 4
我想创建一个ID,以识别始终从状态1开始并在状态4结束的每个循环(无论1和4之间的状态如何),如下所示:
Time Stamp Status ID
2015Dec01:1:00:00 1 1
2015Dec01:2:00:00 2 1
2015Dec01:3:00:00 3 1
2015Dec01:4:00:00 4 1
2015Dec01:5:00:00 1 2
2015Dec01:6:00:00 2 2
2015Dec01:7:00:00 2 2
2015Dec01:8:00:00 4 2
2015Dec01:9:00:00 5 .
2015Dec01:10:00:00 1 3
2015Dec01:11:00:00 3 3
2015Dec01:11:30:00 4 3
有没有人可以帮助我?非常感谢
答案 0 :(得分:1)
定义规则(假设):
如果状态>> 5则缺少ID
data tmp;
set have;
retain ID_TMP 0; *initialize ID;
if status=1 then ID_TMP + 1;
if status<5 then ID=ID_TMP;
DROP ID_TMP;
run;
答案 1 :(得分:0)
我们知道如果current status is < previous status
,新群组已经启动。我们将使用lag
函数保存以前的状态,以便我们可以将当前状态与之前的状态进行比较。
创建一个名为count
的临时变量,以便在我们增加ID时进行计数。由于我们使用的是if-then
逻辑,因此我们希望使用ID
语句初始化count
和retain
,值为1。
有三种情况需要考虑:
如果当前ID小于之前的ID,则将count
增加1并将ID
设置为count
的值;
如果当前ID是&gt; 4,将ID
设置为缺失。
任何时候,ID
都会保持不变。
data want;
set log;
retain count ID 1;
Prior_Status = lag(Status);
if(Status < Prior_Status) then do;
count+1;
ID = count;
end;
else if(Status > 4) then call missing(ID);
drop count Prior_Status;
run;
答案 2 :(得分:0)
这有几种方法。
方法1:
data want;
set have;
if status = 1 then tmp + 1;
if status <= 4 then id = tmp;
else id = .;
run;
方法2:
data want;
set have;
if status = 1 then tmp + 1;
id = choosen((status<=4)+1, ., tmp);
run;