创建一个ID以标识SAS中的每个循环

时间:2016-01-25 22:13:39

标签: loops sas

我在这样的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

有没有人可以帮助我?非常感谢

3 个答案:

答案 0 :(得分:1)

定义规则(假设):

  1. status = 1时的增量ID
  2. 如果状态>> 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语句初始化countretain,值为1。

有三种情况需要考虑:

  1. 如果当前ID小于之前的ID,则将count增加1并将ID设置为count的值;

  2. 如果当前ID是&gt; 4,将ID设置为缺失。

  3. 任何时候,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;