如何按 R 中的日期范围进行过滤?
How to filter by range of dates in R?
我在处理数据库时遇到一些问题...希望能提供一点帮助。
我想统计一个观察值(例如注册车号)在一个时间范围内(例如 90 天)在数据库中出现了多少次。为此,我有一个车号和日期的数值变量,格式为 dd/mm/yyyy(时间序列的范围显然超过 90 天)。我的直觉是创建一个新变量(mutate)来计算按变量日期过滤的观察结果,但我不知道如何引入时间限制。有什么想法吗?
举个例子:
数据库
id date_dd/mm/yyyy
1 01/01/2021
1 01/02/2021
1 02/02/2021
1 03/02/2021
1 30/12/2021
2 05/07/2021
2 03/03/2021
2 04/12/2021
2 07/07/2021
12 01/05/2021
8 06/07/2021
我的主要目标是删除在 90 天内重复超过 3 次的观察结果。总之,生成的数据库将是:
id date_dd/mm/yyyy
1 01/01/2021
1 01/02/2021
1 02/02/2021
1 30/12/2021
2 05/07/2021
2 03/03/2021
2 04/12/2021
2 07/07/2021
12 01/05/2021
8 06/07/2021
正如我上面所解释的,我的想法是创建一个新变量来计算每个 ID 号在 90 天内重复的次数,然后通过删除新变量中得分高于 3 的观察值来过滤数据但我不知道如何在这个时间限制下创建这个新变量。
提前致谢
这是您可以做到的一种方法:
- 使用
lubridate
s ymd
函数获取日期格式
- 按
id
和 arrange
分组
- 计算与第一个日期的差值
- 添加行号列
row
- 根据您的条件过滤!
library(dplyr)
library(lubridate)
df %>%
mutate(date_dd.mm.yyyy = dmy(date_dd.mm.yyyy)) %>%
group_by(id) %>%
arrange(date_dd.mm.yyyy, .by_group = TRUE) %>%
mutate(diff = date_dd.mm.yyyy-first(date_dd.mm.yyyy)) %>%
mutate(row = row_number()) %>%
filter(row <=4 | diff < 90) %>%
select(-diff, -row)
id date_dd.mm.yyyy
<int> <date>
1 1 2021-01-01
2 1 2021-02-01
3 1 2021-02-02
4 1 2021-02-03
5 2 2021-03-03
6 2 2021-07-05
7 2 2021-07-07
8 2 2021-12-04
9 8 2021-07-06
10 12 2021-05-01
使用lubridate
将字符串日期转换为Date
。现在您可以使用 dplyr
按 id
对观察结果进行分组和计数,然后将每个观察结果与上一个观察结果的日期进行比较 lag()
:
library(tidyverse)
df %>%
group_by(id) %>%
mutate(
counter = seq_along(id),
within90days = ifelse(dt <= lag(dt) + 90, TRUE, FALSE)
) %>%
filter(counter <= 3 | !within90days)
我在处理数据库时遇到一些问题...希望能提供一点帮助。
我想统计一个观察值(例如注册车号)在一个时间范围内(例如 90 天)在数据库中出现了多少次。为此,我有一个车号和日期的数值变量,格式为 dd/mm/yyyy(时间序列的范围显然超过 90 天)。我的直觉是创建一个新变量(mutate)来计算按变量日期过滤的观察结果,但我不知道如何引入时间限制。有什么想法吗?
举个例子:
数据库
id date_dd/mm/yyyy
1 01/01/2021
1 01/02/2021
1 02/02/2021
1 03/02/2021
1 30/12/2021
2 05/07/2021
2 03/03/2021
2 04/12/2021
2 07/07/2021
12 01/05/2021
8 06/07/2021
我的主要目标是删除在 90 天内重复超过 3 次的观察结果。总之,生成的数据库将是:
id date_dd/mm/yyyy
1 01/01/2021
1 01/02/2021
1 02/02/2021
1 30/12/2021
2 05/07/2021
2 03/03/2021
2 04/12/2021
2 07/07/2021
12 01/05/2021
8 06/07/2021
正如我上面所解释的,我的想法是创建一个新变量来计算每个 ID 号在 90 天内重复的次数,然后通过删除新变量中得分高于 3 的观察值来过滤数据但我不知道如何在这个时间限制下创建这个新变量。
提前致谢
这是您可以做到的一种方法:
- 使用
lubridate
symd
函数获取日期格式 - 按
id
和arrange
分组
- 计算与第一个日期的差值
- 添加行号列
row
- 根据您的条件过滤!
library(dplyr)
library(lubridate)
df %>%
mutate(date_dd.mm.yyyy = dmy(date_dd.mm.yyyy)) %>%
group_by(id) %>%
arrange(date_dd.mm.yyyy, .by_group = TRUE) %>%
mutate(diff = date_dd.mm.yyyy-first(date_dd.mm.yyyy)) %>%
mutate(row = row_number()) %>%
filter(row <=4 | diff < 90) %>%
select(-diff, -row)
id date_dd.mm.yyyy
<int> <date>
1 1 2021-01-01
2 1 2021-02-01
3 1 2021-02-02
4 1 2021-02-03
5 2 2021-03-03
6 2 2021-07-05
7 2 2021-07-07
8 2 2021-12-04
9 8 2021-07-06
10 12 2021-05-01
使用lubridate
将字符串日期转换为Date
。现在您可以使用 dplyr
按 id
对观察结果进行分组和计数,然后将每个观察结果与上一个观察结果的日期进行比较 lag()
:
library(tidyverse)
df %>%
group_by(id) %>%
mutate(
counter = seq_along(id),
within90days = ifelse(dt <= lag(dt) + 90, TRUE, FALSE)
) %>%
filter(counter <= 3 | !within90days)