如何解决将重叠的间隔与润滑脂结合
我正在寻求组合润滑间隔,以便如果它们重叠,则从内部时间上的最小值取值,从内部时间上的最后值取最大值,并总结以创建一个跨越整个周期的新间隔。这是一个代表:
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
好的,因此在wolf
和moose
级别中,我们有重叠的间隔。假设这是“ 相同”狼,而驼鹿之类的东西会加倍计算天数:
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",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中似乎没有将间隔向量合并为非重叠间隔向量的功能。
这是实现它的一种方法:
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
这允许您执行以下操作:
{{1}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。