我目前有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()之前没有基于“内容识别”创建组。有人知道解决办法吗?任何指导将不胜感激。
答案 0 :(得分:0)
如果我理解正确,那么OP希望在随后两次发生的userid
,userid
之间对属于特定contentid
的所有行进行计数。
为此,我们引入了一个辅助变量rn
,该变量连续编号每个userid
的行。然后,我们可以按userid
,contentid
分组,并取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
请注意,未使用sessionid
和closetime
。结果仅取决于userid
和contentid
的顺序。
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")