数据表:分组基于其中第一行和最后一行共享列值的时间间隔

时间:2019-01-30 16:33:51

标签: r data.table

我目前有data.table下面的各种列:

userid contentid sessionid           closetime
 polly   movies          1 2018-12-16 20:44:09
 polly   music           2 2018-07-13 08:06:35
 polly   movies          3 2018-12-13 12:01:21
 john    music           4 2018-11-07 10:43:40
 john    music           5 2019-01-20 11:35:10

我想添加新的列,被称为“sessionsSinceLastAttempt”,标识了最接近的现有行具有相同的“用户ID”和“内容识别”的值作为当前行,然后包含地计数它们所在之间的行数“用户ID”仍然相同。

所需输出的示例:

userid contentid sessionid           closetime sessionsSinceLastAttempt
 polly   movies          1 2018-12-16 20:44:09                        0
 polly    music          2 2018-07-13 08:06:35                        0
 polly    music          2 2018-07-13 08:06:35                        2
 polly   movies          3 2018-12-13 12:01:21                        4
  john    music          4 2018-11-07 10:43:40                        0
  john    music          5 2019-01-20 11:35:10                        2

目前,我已经尝试过:

data[, sessionsSinceLastAttempt := {
presentcontent = contentid
.SD[, .(sessionsSinceLastAttempt = .N), by = cumsum(contentid == presentcontent)]}, by = c("userid")]

但是,结果简单地取所有行的cumsum()之前没有基于“内容识别”创建组。有人知道解决办法吗?任何指导将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么OP希望在随后两次发生的useriduserid之间对属于特定contentid的所有行进行计数。

为此,我们引入了一个辅助变量rn,该变量连续编号每个userid的行。然后,我们可以按useridcontentid分组,并取rn中的差异:

library(data.table)
setDT(DF)[, rn := rowid(userid)][
  , userSessionsSinceLastAttempt := c(0, diff(rn) + 1), by = .(userid, contentid)][]
   userid contentid sessionid           closetime rn userSessionsSinceLastAttempt
1:  polly    movies         1 2018-12-16 20:44:09  1                            0
2:  polly     music         2 2018-07-13 08:06:35  2                            0
3:  polly    movies         3 2018-12-13 12:01:21  3                            3
4:   john     music         4 2018-11-07 10:43:40  1                            0
5:   john     music         5 2019-01-20 11:35:10  2                            2

请注意,未使用sessionidclosetime。结果仅取决于useridcontentid的顺序。

数据

DF <- readr::read_table("
userid contentid sessionid           closetime
 polly   movies          1 2018-12-16 20:44:09
 polly   music           2 2018-07-13 08:06:35
 polly   movies          3 2018-12-13 12:01:21
 john    music           4 2018-11-07 10:43:40
 john    music           5 2019-01-20 11:35:10")