【问题标题】:How can I use dplyr and lubridate packages to count active records by a series of given dates?如何使用 dplyr 和 lubridate 包按一系列给定日期计算活动记录?
【发布时间】:2018-07-30 02:33:13
【问题描述】:

我正在使用的包:

  • dplyr
  • 润滑

我正在使用的起始数据集:

Employee_ID      Start_Date      End_Date
1                2/1/2013        12/31/9999
2                5/14/2013       10/5/2017
3                9/7/2014        8/30/2017

我希望从起始数据集创建的数据集:

Date             Active_Employee_Count
12/31/2013       2
12/31/2014       3
12/31/2015       3
12/31/2016       3
12/31/2017       1

说明

我希望能够在每年的 12 月 31 日获得在职员工的数量。我正在使用 dplyr 和 lubridate 包来尝试做到这一点,但我很挣扎。我知道 filter、group_by、summarise、mutate 和 distinct 函数,但我不确定这些是否足以完成这项任务。我面临的主要挑战是我如何在 12 月 31 日的日期以某种方式进入这个过程?我是否需要创建某种日期数组(2013 年 12 月 31 日、2014 年 12 月 31 日等),然后以某种方式使用它来执行此操作?

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    您可以使用tidyr::expand() 以及来自lubridate%within%%--% 运算符非常简洁地做到这一点。 %--% 本质上包裹了lubridate::interval(),你可以使用%within% 来测试一个日期是否在一个区间内。

    df <- data.frame(Employee_ID = c(1, 2, 3),
                    Start_Date = mdy(c(02012013, 05142013, 09072014)),
                    End_Date = mdy(c(12319999, 10052017, 08302017)))
    
    df %>% 
      mutate(year = Start_Date) %>%
      expand(nesting(Employee_ID, Start_Date, End_Date), 
             year = seq.Date(from = ymd("2013-12-31"), to = ymd("2017-12-31"), by = "year")) %>%
      mutate(inrange = year %within% (Start_Date %--% End_Date)) %>%
      group_by(year) %>%
      summarize(active_employee_count = sum(inrange))
    
    # A tibble: 5 x 2
      year       active_employee_count
      <date>                     <int>
    1 2013-12-31                     2
    2 2014-12-31                     3
    3 2015-12-31                     3
    4 2016-12-31                     3
    5 2017-12-31                     1
    

    【讨论】:

      【解决方案2】:

      所以,我将员工的 ID 更改为实际姓名。

      df = data.frame(Employee_ID = c("John", "Hugh", "Jack"),
                      Start_Date = mdy(c(02012013, 05142013, 09072014)),
                      End_Date = mdy(c(12319999, 10052017, 08302017)))  
      
      Years_End2 = data.frame(Employee_ID = rep(df$Employee_ID, each = dim(Years_End)[1]),
                              Years_End = seq(from = mdy(12312013), to = mdy(12312017), by = "year"))
      
      df %>% left_join(Years_End2, by = "Employee_ID") %>%
            mutate(Active = (End_Date > Years_End & Start_Date < Years_End)) %>%
            group_by(Years_End) %>%
            summarise(sum(Active))
      
        Years_End  `sum(Active)`
        <date>             <int>
      1 2013-12-31             2
      2 2014-12-31             3
      3 2015-12-31             3
      4 2016-12-31             3
      5 2017-12-31             1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 2021-12-12
        • 2020-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多