我有一系列包含两个变量的数据集:uid和timestamp。我想创建一个名为" session_num"的新变量。将时间戳解析为会话号(当两个时间戳相隔30分钟时,它将被标记为新会话)。
例如:
我尝试在sas中使用retain语句循环遍历时间戳,但它没有用。 这是我的代码:
Data test;
SET test1;
By uid;
RETAIN session_num session_len;
IF first.uid THEN DO;
session=1;
session_len=0;
END;
session_len=session_len+timpestamp;
IF timpestamp-session_len>1800 THEN session_num=session_num+1;
ELSE session_num=session_num;
IF last.uid;
KEEP uid timestamp session_num;
RUN;
真的很感激,如果你能指出我的错误,并建议正确的解决方案。
谢谢!
答案 0 :(得分:2)
首先,这里是一些示例输入数据(将来,您应该提供自己的代码来生成示例输入数据,以便其他人不必花时间为您执行此操作),
data test;
input uid$ timestamp : DATETIME.;
format timestamp DATETIME.;
datalines;
a 05jul2014:03:55:00
a 05jul2014:03:57:00
a 07jul2014:20:08:00
a 10jul2014:19:02:00
a 10jul2014:19:05:00
a 11jul2014:14:39:00
;
然后您可以使用
创建会话变量data testsession;
set test;
retain last;
retain session 0;
by uid;
if first.uid then do;
session = session +1;
last = timestamp;
end;
if (timestamp-last)/60>15 then do;
session = session+1;
end;
last = timestamp;
drop last;
run;
答案 1 :(得分:0)
MrFlick的方法可能是更正常的方法,但另一个选择涉及前瞻自我合并。 (是的,展望未来,即使这应该看起来很落后 - 以这种方式看后面更复杂。)
data want;
retain session 1; *have to initialize to 1 for the first record!;
merge have(in=_h) have(rename=(timestamp=next uid=nextuid) firstobs=2);
output; *output first, then we adjust session for the next iteration;
if (uid ne nextuid) then session=1;
else if timestamp + 1800 < next then session+1;
drop next:;
run;