我有以下结构的数据:
library(data.table)
dt <- data.table(ID = "ABC",
TIME_FROM = structure(c(17897L, 18262L, 18353L, 18628L,
18659L, 18779L, 18993L, 19358L),
class = c("IDate", "Date")),
TIME_TO = structure(c(18261L, 18352L, 18627L, 18658L,
18778L, 18992L, 19357L, 19722L),
class = c("IDate", "Date")),
VALID = c(T, T, T, T, F, T, T, T))
dt
#> ID TIME_FROM TIME_TO VALID
#> 1: ABC 2019-01-01 2019-12-31 TRUE
#> 2: ABC 2020-01-01 2020-03-31 TRUE
#> 3: ABC 2020-04-01 2020-12-31 TRUE
#> 4: ABC 2021-01-01 2021-01-31 TRUE
#> 5: ABC 2021-02-01 2021-05-31 FALSE
#> 6: ABC 2021-06-01 2021-12-31 TRUE
#> 7: ABC 2022-01-01 2022-12-31 TRUE
#> 8: ABC 2023-01-01 2023-12-31 TRUE
我想通过 ID
确定从 9 月 1 日(例如 2020-09-01)开始到 8 月 31 日结束(例如 2021 年)的完整有效的年度圈子 -08-31)。
是否有一种非复杂的方法,最好使用纯 data.table 解决方案?
预期结果
dt_target <- data.table(ID = "ABC",
YEAR = 2019:2024,
FULL_VALID_YR = c(F, T, F, T, T, F))
dt_target
#> ID YEAR FULL_VALID_YR
#> 1: ABC 2019 FALSE
#> 2: ABC 2020 TRUE
#> 3: ABC 2021 FALSE
#> 4: ABC 2022 TRUE
#> 5: ABC 2023 TRUE
#> 6: ABC 2024 FALSE
- 2019 年为 FALSE,因为它缺少 2018 年的最后 4 个月(9 月至 12 月)
- 2020 年为 TRUE,因为从 2019 年 9 月 1 日到 2020 年 8 月 31 日的全年均有效
- 2021 为 FALSE,因为 2021-02-01 到 2021-05-31 的时间段无效
- 2022 年为 TRUE,因为从 2021 年 9 月 1 日到 2022 年 8 月 31 日的全年均有效
- 2023 为 TRUE,因为从 2022 年 9 月 1 日到 2023 年 8 月 31 日的全年均有效
- 2024 为 FALSE,因为它缺少 2024 年的前 8 个月(1 月至 8 月)
最后的注释:
是否包含非完整年份(2019 年和 2024 年)是可选的,因为我不会进一步考虑它们。
当然,是否使用时间段的开始或结束(就像我在上面的示例中所做的那样)来确定年份名称是任意的。
最佳答案
不是 data.table
解决方案,但应该可以将其集成到 data.table
框架中。我使用ivs
包来解决这个问题:
dtValid <- dt[dt$VALID]
ivs <- iv_groups(iv(as.Date(dtValid$TIME_FROM), as.Date(dtValid$TIME_TO) + 1))
#<iv<date>[2]>
#[1] [2019-01-01, 2021-02-01) [2021-06-01, 2024-01-01)
iv_yearly <-
iv(seq(as.Date("2018-09-01"), by = "1 year", length.out = 6),
seq(as.Date("2019-08-31"), by = "1 year", length.out = 6))
#<iv<date>[6]>
#[1] [2018-09-01, 2019-08-31) [2019-09-01, 2020-08-31)
#[3] [2020-09-01, 2021-08-31) [2021-09-01, 2022-08-31)
#[5] [2022-09-01, 2023-08-31) [2023-09-01, 2024-08-31)
iv_overlaps(iv_yearly, ivs, type = "within")
#[1] FALSE TRUE FALSE TRUE TRUE FALSE
关于r - 按任意时间段聚合时间序列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74744350/