我有一些关于人们收听收音机的时间,时长和频道的数据。我需要创建一个名为sessions的变量,它对收音机打开时发生的所有条目进行分组。因为数据可能包含一些错误,我想说,如果从一个通道周期结束到下一个通道周期不到五分钟,那么它仍然是同一个会话。希望一个简短的例子可以澄清。
id obs Entry_date Entry_time duration(in secs) channel
1 1 01/01/12 23:25:21 6000 2
1 2 01/03/12 01:05:64 300 5
1 3 01/05/12 12:12:35 456 5
2 4 01/05/12 16:45:21 657 8
我想创建变量会话以便
id obs Entry_date Entry_time duration(in secs) channel session
1 1 01/01/12 23:25:21 6000 2 1
1 2 01/03/12 01:05:64 300 5 1
1 3 01/05/12 12:12:35 456 5 2
2 4 01/05/12 16:45:21 657 8 1
用于定义1个会话我需要使用entry_time(如果从晚上11点到第二天早晨,则为日期),以便如果entry_time + duration +(5minutes)< entry_time(下一个频道)然后会话改变。这已经杀了我,简单的数组不会做这个技巧,或者我使用数组的尝试没有用。提前致谢
以下代码运行良好,但在ID更改时不会启动会话
data sirius1; /*creates sessions*/
set sirius;
by account_number entry_date_est entry_time_est; /* put in to check data is sorted correctly */
retain session 1; /* initialise session with value 1 */
session+(dif(dhms(entry_date_est,0,0,entry_time_est))-lag(duration_seconds)>300); /* increment session by 1 if time difference > 5 minutes */
run;
答案 0 :(得分:1)
if first.account_number then session=1; *(or first.id or whatever...);
您只需要重新初始化每个新ID。 (您可能需要更频繁地初始化 - 比如每个频道)。我不确定您的示例数据如何与您的代码相关联,因此您可能需要修改BY语句以正确反映它。有关示例信息,您需要
by id channel;
至少 - 所以你可以说
if first.channel then session=1;
因为看起来你需要重置每个频道。