這幾天有點卡住了。假設我有 2 個人的佇列。
第 1 個人在 01/01/2000 至 01/03/2001 的佇列中。第 2 個人在 1999 年 1 月 1 日至 2001 年 12 月 31 日的佇列中。
這意味著第 1 個人在整個 2000 年和 2001 年的 25% 中都在佇列中。第 2 個人在整個 1999 年、2000 年和 2001 年都在佇列中。
將這些加在一起意味著,該佇列在 1999 年貢獻了 1 年人次,在 2000 年貢獻了 2 年人次,在 2001 年貢獻了 1.25 年人次。
有誰知道任何可能有助于劃分/求和這樣的日期之間經過的時間的 R 函式?我可以從頭開始撰寫所有內容,但我想使用現有的函式,如果它們已經存在,而 Google 卻無處可去。
謝謝!
uj5u.com熱心網友回復:
使用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
uj5u.com熱心網友回復:
這是一種可能的通用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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/390440.html
