【问题标题】:Data Table: Grouping based on intervals where first and last rows share column values数据表:根据第一行和最后一行共享列值的间隔进行分组
【发布时间】:2019-01-30 16:33:50
【问题描述】:

我目前有一个 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”的新列,该列标识与当前行具有相同“userid”和“contentid”值的最接近的先前行,然后包含计算它们之间的行数,其中'userid' 还是一样的。

所需输出的示例:

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(),而不根据“contentid”创建组。有人知道修复吗?任何指导将不胜感激。

【问题讨论】:

  • 请提供minimal reproducible example,包括可用于创建和验证答案的预期结果。正如目前所描述的,我并不完全清楚预期的结果是什么。- 谢谢。
  • 好点。道歉。希望这个例子能带来更多的清晰。
  • 非常感谢。但是,我仍在为您的示例而苦苦挣扎。不应该为每个useridclosetime 进行排序吗?是否打算将 sessionid 2 复制到所需的输出中?

标签: r data.table


【解决方案1】:

如果我理解正确,OP 想要在两个后续出现的 useridcontentid 之间计算属于特定 userid 的所有行。

为此,我们引入了一个辅助变量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")

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2015-10-10
    • 2021-05-08
    • 2020-11-10
    相关资源
    最近更新 更多