gpt4 book ai didi

r - 将重叠间隔与 lubridate 结合

转载 作者:行者123 更新时间:2023-12-04 12:16:07 27 4
gpt4 key购买 nike

我希望合并润滑间隔,以便如果它们重叠,则从内部第一个时间获取最小值和从内部最后一个时间获取最大值并总结以创建一个跨越整个时间段的新间隔。这是一个reprex:

library(lubridate, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
library(tibble)

dat <- tibble(
animal = rep(c("elk", "wolf", "moose"), each = 2),
date_interval = c(
interval(as.Date("2020-04-01"), as.Date("2020-04-05")),
interval(as.Date("2020-04-10"), as.Date("2020-04-15")),
interval(as.Date("2020-03-01"), as.Date("2020-04-01")),
interval(as.Date("2020-02-15"), as.Date("2020-03-15")),
interval(as.Date("2020-10-01"), as.Date("2020-11-01")),
interval(as.Date("2020-09-15"), as.Date("2020-10-15"))
)
)

dat
#> # A tibble: 6 x 2
#> animal date_interval
#> <chr> <Interval>
#> 1 elk 2020-04-01 UTC--2020-04-05 UTC
#> 2 elk 2020-04-10 UTC--2020-04-15 UTC
#> 3 wolf 2020-03-01 UTC--2020-04-01 UTC
#> 4 wolf 2020-02-15 UTC--2020-03-15 UTC
#> 5 moose 2020-10-01 UTC--2020-11-01 UTC
#> 6 moose 2020-09-15 UTC--2020-10-15 UTC

好的,在 wolfmoose水平,我们有重叠的间隔。假设这是同一个狼和驼鹿之类的东西会重复计算天数:
dat %>%
group_by(animal) %>%
mutate(time = time_length(date_interval)) %>%
summarise(time_cumu = sum(time))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 3 x 2
#> animal time_cumu
#> <chr> <dbl>
#> 1 elk 777600
#> 2 moose 5270400
#> 3 wolf 5184000
这是我想得到的总结重叠间隔的输出类型:
tibble(
animal = c("elk", "elk", "wolf", "moose"),
date_interval = c(
interval(as.Date("2020-04-01"), as.Date("2020-04-05")),
interval(as.Date("2020-04-10"), as.Date("2020-04-15")),
interval(as.Date("2020-02-15"), as.Date("2020-04-01")),
interval(as.Date("2020-09-15"), as.Date("2020-11-01"))
)
)
#> # A tibble: 4 x 2
#> animal date_interval
#> <chr> <Interval>
#> 1 elk 2020-04-01 UTC--2020-04-05 UTC
#> 2 elk 2020-04-10 UTC--2020-04-15 UTC
#> 3 wolf 2020-02-15 UTC--2020-04-01 UTC
#> 4 moose 2020-09-15 UTC--2020-11-01 UTC
想法?

最佳答案

lubridate 中似乎没有将区间向量合并为非重叠区间向量的函数。
这是实现它的一种方法:

int_merge <- function(x) {
if(length(x) == 1) return(x)
x <- x[order(int_start(x))]
y <- x[1]
for(i in 2:length(x)){
if(int_overlaps(y[length(y)], x[i]))
y[length(y)] <- interval(start = min(int_start(c(y[length(y)], x[i]))),
end = max(int_end(c(y[length(y)], x[i]))))
else
y <- c(y, x[i])
}
return(y)
}
这允许您执行以下操作:
dat %>% 
group_by(animal) %>%
summarize(date_interval = int_merge(date_interval))

#> # A tibble: 4 x 2
#> # Groups: animal [3]
#> animal date_interval
#> <chr> <Interval>
#> 1 elk 2020-04-01 UTC--2020-04-05 UTC
#> 2 elk 2020-04-10 UTC--2020-04-15 UTC
#> 3 moose 2020-09-15 UTC--2020-11-01 UTC
#> 4 wolf 2020-02-15 UTC--2020-04-01 UTC

关于r - 将重叠间隔与 lubridate 结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64653134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com