用于根据不均匀日期创建不均匀组的 R 函数

标签 r date dplyr grouping

我正在尝试找到一个 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/

相关文章:

r - 如何使用 lower.tri 中的匹配整数填充矩阵的 upper.tri?

RStudio 已损坏,无法在 MacOS High Sierra(版本 10.13.6)上打开

r - 使用 R 将列名插入其值

java - 在Android中将日期格式转换为另一种日期?

java - DateFormat 如何解析 java 中的确切日期(如 .NET 中的 DateTime.ParseExact)?

r - R数据帧中基于静态函数的逻辑函数

r - 如何有效地确定每行中的变量值与R中data.table中相同变量后续行值之间的最大差异

r - 在 pdf 输出中的 kable 表中创建水平线

r - 如何生成所有可能的unicode字符?

php - 每个月单独的预订日期范围