假设学校注册数据以这种格式存储,带有开始日期和结束日期字段:

unique_name enrollment_start enrollment_end
Amy 1, Jan, 2017 30, Sep 2018
Franklin 1, Jan, 2017 19, Feb, 2017
Franklin 5, Jun, 2017 4, Feb, 2018
Franklin 21, Oct, 2018 9, Mar, 2019
Samir 1, Jun, 2017 4, Feb, 2017
Samir 5, Apr, 2017 12, Sep, 2018
... ... ...

我想按月份生成注册总数,如下所示:

month enrollment_count
Jan, 2017 25
Feb, 2017 31
Mar, 2017 19
Apr, 2017 34
May, 2017 29
Jun, 2017 32
... ...

有没有一种简单的方法可以通过dplyr实现这一点?

我能想到的唯一方法是循环一个从month_min到month_max的所有月份列表,计算每个月内开始或停止日期的行数.希望代码更简单.

推荐答案

创建一个列表列,其中包含每组日期之间的月序列,然后是Unest和count.

笔记:

  1. 我用lubridate::floor_date()enrollment_start四舍五入到一个月的第一天.否则,如果enrollment_start在当月29日或更晚,则seq()可能会跳过月份.
  2. 示例数据的第五行中的enrollment_startenrollment_end晚——我假设这是一个错误,并将其删除.
library(tidyverse)
library(lubridate)

enrollments %>% 
  mutate(
    across(c(enrollment_start, enrollment_end), dmy),  # convert to date
    month = map2(
      floor_date(enrollment_start, unit = "month"),    # round to 1st day
      enrollment_end,
      ~ seq(.x, .y, by = "month")
    )
  ) %>% 
  unnest_longer(month) %>% 
  count(month, name = "enrollment_count")

#> # A tibble: 27 x 2
#>    month      enrollment_count
#>    <date>                <int>
#>  1 2017-01-01                2
#>  2 2017-02-01                2
#>  3 2017-03-01                1
#>  4 2017-04-01                2
#>  5 2017-05-01                2
#>  6 2017-06-01                3
#>  7 2017-07-01                3
#>  8 2017-08-01                3
#>  9 2017-09-01                3
#> 10 2017-10-01                3
#> # ... with 17 more rows

reprex package(v2.0.1)于2022-03-25创建

R相关问答推荐

如何在球体上绘制轮廓线?

为什么stat_bin在R中的ggplot中显示错误的数字?

如何创建具有总计列和ggplot 2所有条线的百分比标签的堆叠条形图?

如何将y轴上的线定位得彼此更近

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

单击 map 后,将坐标复制到剪贴板

如何计算前一行的值,直到达到标准?

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

将饼图插入条形图

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

在嵌套列表中查找元素路径的最佳方法

如何同时从多个列表中获取名字?

在RStudio中堆叠条形图和折线图

如何删除最后一个可操作对象

按组计算列中1出现的间隔年数

有没有可能用shiny 的书签恢复手风琴面板?

扩展R中包含列表的数据框

避免在图例中显示VLINS组

构建一个6/49彩票模拟系统

如何在R中创建这些列?