1

我有一些关于人们收听广播的时间、时长和频道的数据。我需要创建一个名为 session 的变量,它将收音机打开时出现的所有条目分组。因为数据可能包含一些错误,所以我想说,如果从一个通道周期结束到下一个通道周期结束不到五分钟,那么它仍然是同一个会话。希望一个简短的例子可以澄清。

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(next channel) 那么会话会改变。这一直在杀死我,简单的数组无法解决问题,或者我使用数组的尝试没有奏效。提前致谢

以下代码运行良好,但在 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;
4

1 回答 1

1
if first.account_number then session=1; *(or first.id or whatever...);

您只需要在每个新 ID 处重新初始化。(您可能需要比这更频繁地初始化 - 就像每个频道一样)。我不确定您的示例数据如何与您的代码相关,因此您可能需要修改 BY 语句以正确反映它。对于您的示例信息,您需要

by id channel;

至少 - 所以你可以说

if first.channel then session=1;

因为看起来您需要为每个频道重置。

于 2013-09-13T20:22:11.593 回答