我有一些数据:
data beforehave;
input ID TIME_EVENT $ Activity $;
datalines;
12345 07:03:875 Activity1
12345 07:04:004 Activity1
12345 07:05:062 Activity1
12345 07:07:357 Activity2
12345 07:10:743 Activity2
23145 07:12:737 Activity1
23145 07:14:065 Activity2
23145 07:15:037 Activity2
;
RUN;
我想得到一些看起来像这样的数据,我计算步骤之间的时间,然后每次第一个活动1出现时将计数器重置为0;
data beforehave;
input ID TIME_EVENT $ Activity $ TIME_TAKEN;
datalines;
12345 07:03:875 Activity1 00:00:000
12345 07:04:004 Activity1 00:00:029
12345 07:05:062 Activity1 00:01:058
12345 07:07:357 Activity2 00:01:295
12345 07:10:743 Activity2 00:03:386
23145 07:12:737 Activity1 00:00:000
23145 07:14:065 Activity2 00:01:672
23145 07:15:037 Activity2 00:00:972
;
RUN;
我认为我需要花费特定活动从Activity1
的第一个ID
发生时开始的时间。我已经考虑过这样做的中间步骤,我创建一个更新的字段来拉过TIME_EVENT
的{{1}} Activity1
。这个中间步骤看起来像这样;
data beforehave;
input ID TIME_EVENT $ Activity $ TIME_INTER;
datalines;
12345 07:03:875 Activity1 07:03:875
12345 07:04:004 Activity1 07:03:875
12345 07:05:062 Activity1 07:03:875
12345 07:07:357 Activity2 07:03:875
12345 07:10:743 Activity2 07:03:875
23145 07:12:737 Activity1 07:12:737
23145 07:14:065 Activity2 07:12:737
23145 07:15:037 Activity2 07:12:737
;
RUN;
要创建这个,我可以先使用SAS。功能并写了这个;
data OUT.DATA;
set IN.DATA;
if first.Activity = 'Activity1' then TIME_INTER = TIME_EVENT;
run;
从这里我得到一个空白的领域。
有人可以帮忙吗?
答案 0 :(得分:1)
data OUT.DATA(drop=TIME_EVENT_prev);
set beforehave;
by ID;
retain TIME_EVENT_prev;
if first.ID then TIME_INTER = 0;
else TIME_INTER = TIME_EVENT +(-TIME_EVENT_prev);
TIME_EVENT_prev = TIME_EVENT;
run;
保留变量TIME_EVENT_prev
在每一行都是固定的,在修复当前行之前,它具有前一行的值。
答案 1 :(得分:1)
事实证明,我的TIME_EVENT字段实际上是一种字符格式,因此必须重新制作为时间数据类型。此外,我只有最后一种Activity类型开头的时间戳,所以TIME_INTERVAL成为下一个Activity1之前的时间,这实际上毫无意义。因此,我必须将其设置为0.此代码基本上与上面由andrey_sz发布的代码相同,只是为上面提到的那些事情做了几个推文;
data OUT.DATA(drop=TIME_EVENT_prev);
set beforehave;
by ID;
TIME_EVENT=input(TIME_EVENT,TIME8.);
retain TIME_EVENT_prev;
if first.ID then TIME_INTER = 0;
else TIME_INTER = TIME_EVENT +(-TIME_EVENT_prev);
TIME_EVENT_prev = TIME_EVENT;
if last.logflag then TIME_INTER = 0;
run;