如何按 R 中的多个日期范围进行过滤?

How to filter by multiple range of dates in R?

谢谢各位专家前辈的解答()

我在处理数据时仍然遇到一些问题。

示例:

id  q   date
a   1   01/01/2021
a   1   01/01/2021
a   1   21/01/2021
a   1   21/01/2021
a   1   12/02/2021
a   1   12/02/2021
a   1   12/02/2021
a   1   12/02/2021

我的想法是剔除在 30 天内超过 3 个“单位”的观测值。也就是说,如果“a”在“12/02/2021”[dd/mm]yyyy] 上有一个单位“q”:(a) 如果在 12/01/2021 和 12/02/2021 之间已经有3条意见必须删除。 (b) 如果少于 3 个,必须保留这个。

我的预期结果是:

p   q   date
a   1   01/01/2021
a   1   01/01/2021
a   1   21/01/2021
a   1   12/02/2021
a   1   12/02/2021
a   1   12/02/2021

使用此代码:

df <- df %>%
  mutate(day = dmy(data))%>%
  group_by(p) %>%
  arrange(day, .by_group = TRUE) %>%
  mutate(diff = day - first(day)) %>%
  mutate(row = row_number()) %>%
  filter(row <= 3 | !diff < 30)

但结果是:

P   Q   DATE        DAY       DIFF  ROW
a   1   1/1/2021    1/1/2021    0   1
a   1   1/1/2021    1/1/2021    0   2
a   1   21/1/2021   21/1/2021   20  3
a   1   12/2/2021   12/2/2021   42  5
a   1   12/2/2021   12/2/2021   42  6
a   1   12/2/2021   12/2/2021   42  7
a   1   12/2/2021   12/2/2021   42  8

主要问题是 diff 变量必须计算从前 30 天周期的最后一天算起的 30 天周期中的天数 - 而不是从第一个观察日算起。

有什么帮助吗?谢谢

使用floor_date非常简单:

library(lubridate)
library(dplyr)
df %>% 
  group_by(floor = floor_date(date, '30 days')) %>% 
  slice_head(n = 3) %>% 
  ungroup() %>% 
  select(-floor)

# A tibble: 6 x 3
  id        q date      
  <chr> <int> <date>    
1 a         1 2021-01-01
2 a         1 2021-01-01
3 a         1 2021-01-21
4 a         1 2021-02-12
5 a         1 2021-02-12
6 a         1 2021-02-12

日期

df <- read.table(header = T, text = "id  q   date
a   1   01/01/2021
a   1   01/01/2021
a   1   21/01/2021
a   1   21/01/2021
a   1   12/02/2021
a   1   12/02/2021
a   1   12/02/2021
a   1   12/02/2021")

df$date<-as.Date(df$date, format = "%d/%m/%Y")