R子集数据框遵循基于日期的规则

R subset dataframe following rule based on date

我想使用以下规则限制我的数据框 my_df:如果一个省的所有日期都在 26/09 之前或之后,则应将其删除,如 desired_df

my_df <- data.frame(Province=c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4),
                    date=c("23/09", "24/09", "25/09", "26/09", "27/09", "18/09","21/09", "23/09", "26/09", "29/09", "02/10", "25/09", "26/09", "27/09"))

desired_df <- data.frame(Province=c(1, 1, 1, 1, 1, 4, 4, 4),
                    date=c("23/09", "24/09", "25/09", "26/09", "27/09", "25/09", "26/09", "27/09"))

使用dplyr

我任意变异date2用于过滤date

my_df <- my_df %>% mutate(date2=as.Date(date,'%d/%m'))

my_df %>% group_by(Province) %>% 
  filter(min(date2) < as.Date('2022-09-26'),
         max(date2) > as.Date('2022-09-26')) %>% 
  ungroup() %>% 
  select(-date2)

输出

# A tibble: 8 x 2
  Province date 
     <dbl> <chr>
1        1 23/09
2        1 24/09
3        1 25/09
4        1 26/09
5        1 27/09
6        4 25/09
7        4 26/09
8        4 27/09

您的问题指出 所有 行必须在 9/26 之前或之后才能排除该组,这意味着应保留包含该日期的任何组。但是您的示例不包括第 2 组??

无论如何,使用 data.table,这会生成您的示例输出。

setDT(my_df)[
  , .SD[between(as.Date('26/09', '%d/%m'), min(as.Date(date, '%d/%m')), max(as.Date(date, '%d/%m')), incbounds = FALSE)]
  , by=.(Province)]

您应该知道,其他答案仅在 2022 年有效。