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.table
和lubridate
:
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 值以获得观察次数