假设有以下数据框:
df <- tibble(ID = c(12, 12, 12, 13, 13, 13),
times = c(as.POSIXct("2021-01-02 10:00:00"),
as.POSIXct("2021-01-02 11:00:00"),
as.POSIXct("2021-01-02 13:00:00"),
as.POSIXct("2021-01-02 13:00:00"),
as.POSIXct("2021-01-02 14:00:00"),
as.POSIXct("2021-01-02 15:00:00")))
ID times
<dbl> <dttm>
1 12 2021-01-02 10:00:00
2 12 2021-01-02 11:00:00
3 12 2021-01-02 13:00:00
4 13 2021-01-02 13:00:00
5 13 2021-01-02 14:00:00
6 13 2021-01-02 15:00:00
我想要的是一列数据,它以每个ID的时间戳为起始值,并计算连续出现下一个2小时内的观测次数。所以这就是我的目标:
ID times n_obs_within_2h
<dbl> <dttm> <dbl>
1 12 2021-01-02 10:00:00 2
2 12 2021-01-02 11:00:00 2
3 12 2021-01-02 13:00:00 1
4 13 2021-01-02 13:00:00 3
5 13 2021-01-02 14:00:00 2
6 13 2021-01-02 15:00:00 1
我知道可以使用purrr::map
来迭代每一行轻松完成此操作。然而,我的原始数据集非常大,这样做效率相对较低。你能想到除了逐行迭代之外的另一种方法来计算n_obs_within_2h
吗?
编辑:我的当前尝试:
df %>% group_by(ID) %>%
mutate(n_obs_with_2h = purrr::pmap_dbl(.l = list(ID, times),
.f = function(i, t, data) {
n <- data %>%
filter(ID == i) %>%
filter(between(as.double.difftime(times-t, units = "hours"),
0, 2)) %>%
nrow()
return(n)
}, data = .))