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 年有效。
我想使用以下规则限制我的数据框 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 年有效。