【问题标题】:R functions to divide person-time by year of observationR函数按观察年份划分人时
【发布时间】:2022-01-23 19:42:36
【问题描述】:

这几天有点卡住了。 假设我有 2 个人。

第 1 个人在 2000 年 1 月 1 日至 2001 年 1 月 3 日之间的队列中。 第 2 个人在 1999 年 1 月 1 日至 2001 年 12 月 31 日的队列中。

这意味着第 1 个人在 2000 年全年和 2001 年的 25% 都在同类群组中。 第 2 个人在 1999 年、2000 年和 2001 年都在队列中。

将这些加在一起意味着,该队列在 1999 年总共贡献了 1 年的人次, 2000 年 2 年人次,2001 年 1.25 年人次。

有没有人知道任何 R 函数可能有助于在这样的日期之间划分/求和经过的时间?我可以从头开始编写所有内容,但我想使用现有的函数,如果它们存在的话,而谷歌却无处可去。

谢谢!

【问题讨论】:

    标签: r time


    【解决方案1】:

    使用data.tablelubridate

    Data <- Data[, .(Start, Start2 = seq(Start, End, by="year"), End), by=.(Person)]
    Data[, End2 := Start2+years(1)-days(1)]
    Data[year(Start2) != year(Start), Start := Start2]
    Data[year(End2) != year(End), End := End2]
    Data[, c("Year", "Contribution") := list(year(Start), (month(End)-month(Start)+1)/12)]
    Data <- Data[, .(Contribution = sum(Contribution)), by=.(Year)][order(Year)]
    

    这给出了:

    > Data
       Year Contribution
    1: 1999         1.00
    2: 2000         2.00
    3: 2001         1.25
    

    【讨论】:

      【解决方案2】:

      这是一种可能的通用tidyverse 方法,也使用lubridate。这会为每年创建行,并为每个人年创建适当的时间间隔。日历年和人年间隔之间的交集将是最后总结的贡献。请注意,这里从 1 月 1 日到 3 月 1 日将被视为 2 个月或一年的 1/6(不是 25%)。

      df <- data.frame(
        person = c("Person 1", "Person 2"),
        start = c("01/01/2000", "01/01/1999"),
        end = c("01/03/2001", "31/12/2001")
      )
      
      df$start <- dmy(df$start)
      df$end <- dmy(df$end)
      
      library(lubridate)
      library(tidyverse)
      
      df %>%
        mutate(date_int = interval(start, end),
               year = map2(year(start), year(end), seq)) %>%
        unnest(year) %>%
        mutate(
          year_int = interval(
            as.Date(paste0(year, '-01-01')), as.Date(paste0(year, '-12-31'))
            ),
          year_sect = intersect(date_int, year_int)
        ) %>%
        group_by(year) %>%
        summarise(contribute = signif(sum(as.numeric(year_sect, "years")), 2))
      

      输出

         year contribute
        <int>      <dbl>
      1  1999        1  
      2  2000        2  
      3  2001        1.2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 2023-03-07
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        • 1970-01-01
        相关资源
        最近更新 更多