gpt4 book ai didi

r - 不一定连续的时间间隔并集

转载 作者:行者123 更新时间:2023-12-04 05:11:22 26 4
gpt4 key购买 nike

我正在寻找 union 的实现对于能够处理本身不是间隔的并集的时间间隔。

我注意到了lubridate包括 union时间间隔的函数,但它总是返回一个间隔,即使并集不是间隔(即它返回由两个开始日期的最小值和两个结束日期的最大值定义的间隔,忽略任何间隔未涵盖的中间时期) :

library(lubridate)
int1 <- new_interval(ymd("2001-01-01"), ymd("2002-01-01"))
int2 <- new_interval(ymd("2003-06-01"), ymd("2004-01-01"))
union(int1, int2)
# Union includes intervening time between intervals.
# [1] 2001-01-01 UTC--2004-01-01 UTC

我也看过 interval包,但其文档未提及 union .

我的最终目标是使用复杂联合 %within% :

my_int %within% Reduce(union, list_of_intervals)

因此,如果我们考虑一个具体示例,假设 list_of_intervals是:

[[1]] 2000-01-01 -- 2001-01-02 
[[2]] 2001-01-01 -- 2004-01-02
[[3]] 2005-01-01 -- 2006-01-02

然后my_int <- 2001-01-01 -- 2004-01-01不是 %within% list_of_intervals所以它应该返回 FALSEmy_int <- 2003-01-01 -- 2006-01-01应该是TRUE .

但是,我怀疑复杂联合的用途远不止于此。

最佳答案

如果我正确理解您的问题,您希望从一组可能重叠的区间开始,并获得表示输入集 UNION 的区间列表,而不仅仅是跨越最小值和最大值的单个区间输入集。这是我的同一个问题。

在以下位置提出了类似的问题:Union of intervals

...但是接受的响应因间隔重叠而失败。然而,hosolmaz(我是 SO 的新手,所以不知道如何链接到这个用户)发布了一个修改(在 Python 中)来解决这个问题,然后我将其转换为 R,如下所示:

library(dplyr) # for %>%, arrange, bind_rows

interval_union <- function(input) {
if (nrow(input) == 1) {
return(input)
}
input <- input %>% arrange(start)
output = input[1, ]
for (i in 2:nrow(input)) {
x <- input[i, ]
if (output$stop[nrow(output)] < x$start) {
output <- bind_rows(output, x)
} else if (output$stop[nrow(output)] == x$start) {
output$stop[nrow(output)] <- x$stop
}
if (x$stop > output$stop[nrow(output)]) {
output$stop[nrow(output)] <- x$stop
}
}
return(output)
}

以您的示例为例,间隔重叠且不连续:

d <- as.data.frame(list(
start = c('2005-01-01', '2000-01-01', '2001-01-01'),
stop = c('2006-01-02', '2001-01-02', '2004-01-02')),
stringsAsFactors = FALSE)

这会产生:

> d
start stop
1 2005-01-01 2006-01-02
2 2000-01-01 2001-01-02
3 2001-01-01 2004-01-02

> interval_union(d)
start stop
1 2000-01-01 2004-01-02
2 2005-01-01 2006-01-02

我是 R 编程的新手,所以如果有人可以将上面的 interval_union() 函数转换为参数,不仅接受输入数据框,还接受要使用的“开始”和“停止”列的名称这样该功能就可以更轻松地重用,那就太好了。

关于r - 不一定连续的时间间隔并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14888660/

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