R计算日期范围之间的每月发生频率
R Count monthly frequency of occurrence between date range
x <- data.frame(ID = c(1,2,3,4),
Line_name = c("AB", "CD", "AB", "CD"),
start_dt = c("12/1/2020", "2/1/2021", "2/1/2021", "3/1/2021"),
end_dt = c("4/1/2021", "4/1/2021", "3/1/2021", "4/1/2021"))
ID Line_name start_dt end_dt
1 AB 12/1/2020 4/1/2021
2 CD 2/1/2021 4/1/2021
3 AB 2/1/2021 3/1/2021
4 CD 3/1/2021 4/1/2021
我有一个看起来像这样的数据框。它具有在日期范围(开始日期到结束日期)内使用的项目。我需要计算每个月每个项目的使用频率。结果输出看起来像这样。
Line_name Jan2021 Feb2021 Mar2021 Apr2021
1 AB 1 2 2 1
2 CD 0 1 2 2
1 月,仅使用了 AB。对于 ID 1,日期范围是从一月到四月。所以我们需要计算从 1 月到 4 月的每个月的那一行。
我不确定我该怎么做。我在想,例如 1 月,我会检查 1/1/2021 日期是否在 start_dt 和 end_dt 范围内,如果该条件为真而不是计数。
(date %within% interval(start_dt, end_dt))
一个选项是通过 month
在 'start_dt' 和 'end_dt' 列之间获取日期序列 map2
到 list
,然后unnest
list
列,获取 count
并使用 pivot_wider
从 'long' 重新整形为 'wide'
library(lubridate)
library(dplyr)
library(tidyr)
x %>%
transmute(Line_name, Year_month = map2(mdy(start_dt), mdy(end_dt),
~ format(seq(.x, .y, by = '1 month'), '%b%Y'))) %>%
unnest(c(Year_month)) %>%
count(Line_name,
Year_month = factor(Year_month, levels = unique(Year_month))) %>%
pivot_wider(names_from = Year_month, values_from = n, values_fill = 0)
-输出
# A tibble: 2 x 5
Line_name Jan2021 Feb2021 Mar2021 Apr2021
<chr> <int> <int> <int> <int>
1 AB 1 2 2 1
2 CD 0 1 2 2
x <- data.frame(ID = c(1,2,3,4),
Line_name = c("AB", "CD", "AB", "CD"),
start_dt = c("12/1/2020", "2/1/2021", "2/1/2021", "3/1/2021"),
end_dt = c("4/1/2021", "4/1/2021", "3/1/2021", "4/1/2021"))
ID Line_name start_dt end_dt
1 AB 12/1/2020 4/1/2021
2 CD 2/1/2021 4/1/2021
3 AB 2/1/2021 3/1/2021
4 CD 3/1/2021 4/1/2021
我有一个看起来像这样的数据框。它具有在日期范围(开始日期到结束日期)内使用的项目。我需要计算每个月每个项目的使用频率。结果输出看起来像这样。
Line_name Jan2021 Feb2021 Mar2021 Apr2021
1 AB 1 2 2 1
2 CD 0 1 2 2
1 月,仅使用了 AB。对于 ID 1,日期范围是从一月到四月。所以我们需要计算从 1 月到 4 月的每个月的那一行。
我不确定我该怎么做。我在想,例如 1 月,我会检查 1/1/2021 日期是否在 start_dt 和 end_dt 范围内,如果该条件为真而不是计数。 (date %within% interval(start_dt, end_dt))
一个选项是通过 month
在 'start_dt' 和 'end_dt' 列之间获取日期序列 map2
到 list
,然后unnest
list
列,获取 count
并使用 pivot_wider
library(lubridate)
library(dplyr)
library(tidyr)
x %>%
transmute(Line_name, Year_month = map2(mdy(start_dt), mdy(end_dt),
~ format(seq(.x, .y, by = '1 month'), '%b%Y'))) %>%
unnest(c(Year_month)) %>%
count(Line_name,
Year_month = factor(Year_month, levels = unique(Year_month))) %>%
pivot_wider(names_from = Year_month, values_from = n, values_fill = 0)
-输出
# A tibble: 2 x 5
Line_name Jan2021 Feb2021 Mar2021 Apr2021
<chr> <int> <int> <int> <int>
1 AB 1 2 2 1
2 CD 0 1 2 2