R 计算日期范围之间每月发生的频率

标签 r date dplyr count frequency

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 月,我会检查 1/1/2021 日期是否在 start_dt 和 end_dt 范围内,以及该条件是否为真而不是 count。 (日期%in%间隔(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

关于R 计算日期范围之间每月发生的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68456807/

相关文章:

r - 如何确定第一个整数/浮点值在列表中的开始位置

r - java.io.IOException:没有用于方案的文件系统:R编程中的hdfs

r - 将 RScript 的输出分配给 makefile 变量

r - 解析出字符串,将其设置为 R data.table 中的因子列

使用 DateTimeFormatter 解析 AM/PM 时间时出现 Java 8 DateTimeParseException

mysql - 保修期已过?

按组回归并保留R中的所有列

sql - 使用 vb.net 在 SQL 中保存日期

减少每个因子 dplyr 方法的级别数

r - 将带破折号的 quosure 转换为字符串?