首页 > 解决方案 > 聚合行及时关闭

问题描述

我在 R 中有一个数据集,格式如下:

data = data.table(
id = c(1, 2, 2, 2, 3, 3, 3, 3 ,3, 3),
Start = c("2019-03-01 09:15:36", 
"2019-01-01 08:00:00", "2019-01-01 08:00:10","2019-01-01 08:00:30",
"2019-01-01 08:00:30", "2019-01-01 08:00:40","2019-01-01 08:00:50",
"2019-01-01 08:01:10", "2019-01-01 08:01:20","2019-01-01 08:01:31"
))
data$Start = as.POSIXct(data$Start ,format = "%Y-%m-%d %H:%M:%S")

每行代表与一个人的交互,每个人由 id 标识(在示例数据集中,我有 3 个人)。根据定义,应合并开始日期之间少于 15 秒的交互(仅计为一次)。这个 15 秒的窗口应该随着每次新的交互而延长(参见第 3 个人的示例结果)。

鉴于此规则,对于data,我想创建一个标识唯一交互的 newID 列。结果应该是:

data$newID 
[1] 1 2 2 3 4 4 4 5 5 5

这就像应该在 内可能发生的事情data.table,没有低效的for循环,但我不能让它工作......

标签: rperformancedatetimedata.tableaggregate

解决方案


一种方法是在每次值大于 15 时计算差异并更改组

data[, new := c(NA,diff.difftime(Start))][, new_id := cumsum(c(1, abs(na.omit(new)) >= 15))]

这使,

    id               Start      new new_id
 1:  1 2019-03-01 09:15:36       NA      1
 2:  2 2019-01-01 08:00:00 -5102136      2
 3:  2 2019-01-01 08:00:10       10      2
 4:  2 2019-01-01 08:00:30       20      3
 5:  3 2019-01-01 08:00:00      -30      4
 6:  3 2019-01-01 08:00:10       10      4
 7:  3 2019-01-01 08:00:20       10      4
 8:  3 2019-01-01 08:00:40       20      5
 9:  3 2019-01-01 08:00:50       10      5
10:  3 2019-01-01 08:01:01       11      5

您可以像往常一样删除任何不需要的列


推荐阅读