R函数按观察年份划分人时

Posted

技术标签:

【中文标题】R函数按观察年份划分人时【英文标题】:R functions to divide person-time by year of observation 【发布时间】: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 函数可能有助于在这样的日期之间划分/求和经过的时间?我可以从头开始编写所有内容,但我想使用现有的函数,如果它们存在的话,而谷歌却无处可去。

谢谢!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于R函数按观察年份划分人时的主要内容,如果未能解决你的问题,请参考以下文章

如何通过另一个变量中的观察来总结一个变量中的唯一值?

R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?

划分训练、测试集和数据观察

R 按唯一列 PAIRS(B-A 和 A-B)和非唯一组合(B-A 或 A-B)对观察结果求和

如何使用 R 中 gplot() 包中的 plotmean() 函数使用 paste0() 操作 n.label 值以获得观察次数

来自 selectInput 的具有多个条件的闪亮 R 观察事件