计算R中每个访问者的唯一会话

计算R中每个访问者的唯一会话,r,sqldf,R,Sqldf,我有下表,我想计算唯一会话的数量,假设:如果同一个访问者(浏览器)有两个超过30分钟差异的连续时间戳,那么这些应该被视为两个唯一会话 浏览器是唯一标识每个用户的 时间戳是带有时间的日期 页面是url页面 Browsers timestamp Page x 2014-01-01 14:15:33 1 x 2014-01-01 14:16:33 2 x 2014-01-01 14:17:33

我有下表,我想计算唯一会话的数量,假设:如果同一个访问者(浏览器)有两个超过30分钟差异的连续时间戳,那么这些应该被视为两个唯一会话

浏览器是唯一标识每个用户的 时间戳是带有时间的日期 页面是url页面

Browsers    timestamp             Page
  x        2014-01-01 14:15:33     1
  x        2014-01-01 14:16:33     2
  x        2014-01-01 14:17:33     3
  x        2014-01-01 16:15:33     1
  y        2014-01-01 16:20:33     5
  y        2014-01-01 16:25:33     2
因此,根据给出的逻辑和上面的虚拟表,我应该得到3个唯一的会话。2用于浏览器x,1用于浏览器y


我对R相当陌生,所以我甚至不知道如何开始。非常感谢阅读相关内容的任何帮助或建议。

使用
数据的解决方案。表

setDT(df)[order(timestamp), .(uniSession = sum(diff(timestamp) > 30) + 1), .(Browsers)]
   Browsers uniSession
1:        x          2
2:        y          1

使用
数据的解决方案。表

setDT(df)[order(timestamp), .(uniSession = sum(diff(timestamp) > 30) + 1), .(Browsers)]
   Browsers uniSession
1:        x          2
2:        y          1

使用
dplyr

library(dplyr)
df %>%
   group_by(Browsers) %>%
   arrange(timestamp) %>%
   summarise(uniSession = sum(diff(timestamp) > 30) + 1)

使用
dplyr

library(dplyr)
df %>%
   group_by(Browsers) %>%
   arrange(timestamp) %>%
   summarise(uniSession = sum(diff(timestamp) > 30) + 1)


你想跑步做什么?例如,如果浏览器
z
的时间戳为8:00、8:20和8:40,那么这是1个会话吗?完全正确!在我的数据集中。我的数据集中的每一行代表对我的站点的一个页面的访问。列浏览器表示用户的ID。每个用户可以访问一个页面并离开,也可以单击更多页面。如果同一个访问者的连续时间戳大于30分钟,则应将这两个访问者标识为两个不同的访问者您的时间戳列是否已经是一个有用的POSIX类,还是一个字符或因子?我使用POSIXct fn将其转换为本地时间,是的。您想对运行做什么?例如,如果浏览器
z
的时间戳为8:00、8:20和8:40,那么这是1个会话吗?完全正确!在我的数据集中。我的数据集中的每一行代表对我的站点的一个页面的访问。列浏览器表示用户的ID。每个用户可以访问一个页面并离开,也可以单击更多页面。如果同一个访问者的连续时间戳大于30分钟,则应将这两个访问者标识为两个不同的访问者您的时间戳列是否已经是一个有用的POSIX类,还是一个字符或因子?我使用POSIXct fn将其转换为本地时间,是的。它可以工作,但我不需要每个浏览器的总和(抱歉,如果我试图确保理解逻辑时有误导性)因为我有数千个,这没有用。相反,我想要一个更聚合的值,或者是合计的值,或者理想地按另一列进行分组,比如说为了论证平台。是否有任何方法可以获得保留逻辑的整个数据集的合计值(实际上是脚本结果的总和)您可以在之后添加另一个摘要会话,即
setDT(df)[order(timestamp),(uniSession=sum(diff(timestamp)>30)+1),(Browsers)][,(sumUniSessions=sum(uniSession))]
,这将使
sumUniSessions
成为3。谢谢。最后一件事,我可以按我的数据集的另一列对这些会话进行分组。即使分两步进行。例如,在第一次会话中添加此列,然后在第二次会话中添加by=col.name。这取决于您的列是什么,如果它不与浏览器相交,我指的是每个Browser对该列只有一个唯一值,然后您可以在两个会话中将该列添加到组变量中。另一方面,您可能需要重新定义逻辑。它可以工作,但我不需要每个浏览器的总和(抱歉,如果我试图确保理解逻辑时有误导性)因为我有上千个数据集,所以它没有用处。相反,我想要一个更聚合的值,或者是合计的值,或者理想地由另一列进行分组,比如说为了参数平台。是否有任何方法可以获得保留逻辑的整个数据集的合计值(实际上是脚本结果的总和)您可以在之后添加另一个摘要会话,即
setDT(df)[顺序(时间戳),(uniSession=sum(diff(时间戳)>30)+1),(浏览器)][,(sumUniSessions=sum(uniSession))]
,这将使
sumUniSessions
成为3。谢谢。最后一件事,我可以按我的数据集的另一列对这些会话进行分组。即使分两步进行。例如,在第一次会话中添加此列,然后在第二次会话中添加by=col.name。这取决于您的列是什么,如果它不与浏览器相交,我指的是每个Browser对该列只有一个唯一值,然后您可以在两个会话中将该列添加到组变量中。否则,您可能需要重新定义逻辑。