我正在尝试找到一个 R 函数,它可以在给定一组不均匀间隔的日期、不均匀的组大小和分组情况的情况下迭代索引组。以下是示例数据:
> h
# A tibble: 20 x 2
ID date
<int> <date>
1 1 2021-01-07
2 1 2021-01-11
3 1 2021-01-15
4 1 2021-01-16
5 1 2021-01-21
6 1 2021-01-26
7 1 2021-02-04
8 1 2021-02-08
9 1 2021-02-13
10 1 2021-02-20
11 1 2021-02-23
12 1 2021-02-27
13 2 2021-01-05
14 2 2021-01-11
15 2 2021-02-02
16 2 2021-02-08
17 2 2021-02-08
18 2 2021-02-14
19 2 2021-02-17
20 2 2021-02-21
对于每个唯一的ID
,我想找到第一个日期(按时间顺序)并为该案例和任何其他案例创建一个组(即group==1
) 7天内行。对于 7 天后的下一个日期,为该案例以及接下来 7 天内的任何其他案例创建第二个组(即 group==2
)。注意:下一个日期不一定是初始日期后的 7 天。对剩余的剩余情况重复此过程以获得所需的输出:
# A tibble: 20 x 3
ID date group
<int> <date> <dbl>
1 1 2021-01-07 1
2 1 2021-01-11 1
3 1 2021-01-15 2
4 1 2021-01-16 2
5 1 2021-01-21 2
6 1 2021-01-26 3
7 1 2021-02-04 4
8 1 2021-02-08 4
9 1 2021-02-13 5
10 1 2021-02-20 5
11 1 2021-02-23 6
12 1 2021-02-27 6
13 2 2021-01-05 1
14 2 2021-01-11 1
15 2 2021-02-02 2
16 2 2021-02-08 2
17 2 2021-02-08 2
18 2 2021-02-14 3
19 2 2021-02-17 3
20 2 2021-02-21 3
据我所知,使用 7 天的滚动窗口函数将不起作用,因为它会错误地对案例进行分组。但我想知道是否可以使用某种自定义滚动窗口函数?我更喜欢使用 dplyr 的解决方案,但其他选项也可以。如有任何帮助,我们将不胜感激。
> dput(h)
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), date = structure(c(18634,
18638, 18642, 18643, 18648, 18653, 18662, 18666, 18671, 18678,
18681, 18685, 18632, 18638, 18660, 18666, 18666, 18672, 18675,
18679), class = "Date")), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
最佳答案
定义一个函数 date1,它给出前一行点组的第一个日期,当前行的日期返回当前组的开始日期——它必须是两个参数之一。然后按 ID 分组,使用 Reduce 将其应用于每个 ID 中的日期,并将结果转换为因子,然后转换为整数。
library(dplyr)
date1 <- function(prev, x) if (x > prev + 7) x else prev
h %>%
group_by(ID) %>%
mutate(group = as.integer(factor(Reduce(date1, date, acc = TRUE)))) %>%
ungroup
给予:
# A tibble: 20 x 3
ID date group
<int> <date> <dbl>
1 1 2021-01-07 1
2 1 2021-01-11 1
3 1 2021-01-15 2
4 1 2021-01-16 2
5 1 2021-01-21 2
6 1 2021-01-26 3
7 1 2021-02-04 4
8 1 2021-02-08 4
9 1 2021-02-13 5
10 1 2021-02-20 5
11 1 2021-02-23 6
12 1 2021-02-27 6
13 2 2021-01-05 1
14 2 2021-01-11 1
15 2 2021-02-02 2
16 2 2021-02-08 2
17 2 2021-02-08 2
18 2 2021-02-14 3
19 2 2021-02-17 3
20 2 2021-02-21 3
关于用于根据不均匀日期创建不均匀组的 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67452859/