r - R:data.table:使用随时间引用的聚合
问题描述
我有一个带有句点的数据集
active <- data.table(id=c(1,1,2,3), beg=as.POSIXct(c("2018-01-01 01:10:00","2018-01-01 01:50:00","2018-01-01 01:50:00","2018-01-01 01:50:00")), end=as.POSIXct(c("2018-01-01 01:20:00","2018-01-01 02:00:00","2018-01-01 02:00:00","2018-01-01 02:00:00")))
> active
id beg end
1: 1 2018-01-01 01:10:00 2018-01-01 01:20:00
2: 1 2018-01-01 01:50:00 2018-01-01 02:00:00
3: 2 2018-01-01 01:50:00 2018-01-01 02:00:00
4: 3 2018-01-01 01:50:00 2018-01-01 02:00:00
在此期间,一个 id 处于活动状态。我想汇总ids
并确定每个点
time <- data.table(seq(from=min(active$beg),to=max(active$end),by="mins"))
处于非活动状态的 ID 数量以及它们激活前的平均分钟数。也就是说,理想情况下,表格看起来像
>ans
time inactive av.time
1: 2018-01-01 01:10:00 2 30
2: 2018-01-01 01:11:00 2 29
...
50: 2018-01-01 02:00:00 0 0
我相信这可以使用data.table
但我无法弄清楚获取时差的语法。
解决方案
使用,我们可以通过虚拟变量连接来创建和dplyr
的笛卡尔积。and的定义可能并不完全是您正在寻找的内容,但它应该可以帮助您入门。如果您的数据非常大,我同意这将是一种更好的处理方式。time
active
inactive
av.time
data.table
library(tidyverse)
time %>%
mutate(dummy = TRUE) %>%
inner_join({
active %>%
mutate(dummy = TRUE)
#join by the dummy variable to get the Cartesian product
}, by = c("dummy" = "dummy")) %>%
select(-dummy) %>%
#define what makes an id inactive and the time until it becomes active
mutate(inactive = time < beg | time > end,
TimeUntilActive = ifelse(beg > time, difftime(beg, time, units = "mins"), NA)) %>%
#group by time and summarise
group_by(time) %>%
summarise(inactive = sum(inactive),
av.time = mean(TimeUntilActive, na.rm = TRUE))
# A tibble: 51 x 3
time inactive av.time
<dttm> <int> <dbl>
1 2018-01-01 01:10:00 3 40
2 2018-01-01 01:11:00 3 39
3 2018-01-01 01:12:00 3 38
4 2018-01-01 01:13:00 3 37
5 2018-01-01 01:14:00 3 36
6 2018-01-01 01:15:00 3 35
7 2018-01-01 01:16:00 3 34
8 2018-01-01 01:17:00 3 33
9 2018-01-01 01:18:00 3 32
10 2018-01-01 01:19:00 3 31
推荐阅读
- java - 提高 mongo 查询性能(使用子查询)
- java - 如何在 Spring Retry 中打开和关闭 @Recover 方法?
- python - 按两列分组行并通过比较过滤值
- sql-server - 使用 BINARY_CHECKSUM 的 T-SQL 类型 2 SCD
- android - 即使安装了新的 android 应用程序,它仍然显示旧版本的构建错误
- amp-html - 如何使用 amp-form 设置 ajax 标头
- x86 - PCIe 插槽上的 SMBus
- python - 我可以在树莓派 3 B+ 中使用蓝牙耳机进行语音识别吗?
- deep-learning - 使用连体网络的人脸检测演示
- python-3.x - 在kivy上获得一个空白屏幕