2013-02-15 2 views
1

나는 그 자체로 간격이 아닌 공용체를 처리 할 수있는 시간 간격으로 union의 구현을 찾고 있습니다.연속하지 않아도되는 시간 간격의 조합

시간 간격에 대해 lubridateunion 함수가 포함되어 있지만 공용체가 간격이 아니어도 단일 간격을 반환합니다 (즉, 시작일과 최대 양쪽 끝의 최대 값으로 정의 된 간격을 반환합니다). 날짜, 어느 구간에 포함되지 개입 기간) 무시 :

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에 대한 참조를하지 않습니다를.

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하지

내 최종 목표는 %within%와 복잡한 조합을 사용하는 것입니다 따라서 FALSEmy_int <- 2003-01-01 -- 2006-01-01을 반환해야합니다. 따라서 TRUE이어야합니다.

그러나 복잡한 공용체에는 이보다 많은 용도가 있다고 생각됩니다.

+1

제공 한 예를 사용하여 원하는 결과물을 찾으십시오. – JackeJR

+0

@RJ 예상 결과와 함께 구체적인 예를 추가했습니다. – orizon

+0

@orizon 나는 당신의 예제와 다소 혼동을 느낀다 : 왜 첫 번째'my_int'에 대해'TRUE'를 얻어야하지만 두 번째 것에 대해서는'TRUE'를 가져야 하는가? 첫 번째 것은 귀하의 목록의 간격 중 하나에 포함되어 있지 않습니까? – juba

답변

1

질문을 올바르게 이해하면 잠재적으로 겹치는 간격 집합으로 시작하여 최소값과 최대 값의 단일 간격보다 입력 된 값의 UNION을 나타내는 간격 목록을 얻고 싶습니다. 입력 집합의이것은 제가 가지고있는 것과 같은 질문입니다.

비슷한 질문

은 질문을 받았다 : Union of intervals

...하지만 받아 응답은 중복 간격으로 실패합니다. 그러나 hosolmaz 다음과 같이 그때 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) 

이 생산 : 사람이 위의 interval_union() 함수를 변환 할 수 있습니다, 그래서 만약

> 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 프로그래밍에 대한 상대 초보자입니다 중복 및 비 연속 간격과의 예와 매개 변수로 입력 데이터 프레임뿐만 아니라 '시작'및 '중지'열의 이름을 사용하여 함수를보다 쉽게 ​​재사용 할 수 있도록 허용하는 것이 좋습니다.

1

음, 예에서 당신은 int1의, 노동 조합을 제공 int2는 두 간격 벡터로 볼 수 있습니다 : 당신이 뭔가를 할 수 있도록 벡터에

int1 <- new_interval(ymd("2001-01-01"), ymd("2002-01-01")) 
int2 <- new_interval(ymd("2003-06-01"), ymd("2004-01-01")) 
ints <- c(int1,int2) 

%within% 작품 :

: 당신의 간격이 any와 목록의 간격 중 하나 인 경우
my_int <- new_interval(ymd("2001-01-01"), ymd("2004-01-01")) 
my_int %within% ints 
# [1] TRUE FALSE 

그래서 당신은 확인하실 수 있습니다
any(my_int %within% ints) 
# [1] TRUE 

귀하의 의견은 %within%에 의해 주어진 결과는 말한다 문서와 일관성하지 않는 것 맞다 :

를 A는 간격이 모두 그 시작과 끝 날짜 나 내에해야하는 경우 TRUE를 반환합니다.

setMethod("%within%", signature(a = "Interval", b = "Interval"), function(a,b){ 
    as.numeric([email protected]) - as.numeric([email protected]) <= [email protected] & as.numeric([email protected]) - as.numeric([email protected]) >= 0 
}) 

그래서 a의 시작점에 대해 테스트 것 같다 : a와 b가 모두 간격 때 나는 %within%의 소스 코드를 보면

는 다음과 같은 것 같다 b이며 결과와 일관성이 있습니다. 아마 이것은 버그로 간주되어야하고보고되어야합니까?

+0

''my_int''가 두 개 이상의 간격의 합집합의 하위 간격 일 뿐이며 한 간격의 하위 간격이 아닌 경우에는 작동하지 않습니다. 나는 또한''my_int % within % int1''은 서브 구간이 아니므로 TRUE입니다. 그러나 나는 그 행동을 확인했다 – orizon

+0

@orizon 네, 맞아, 나는 눈치 채지 못했지만이 결과는 조금 이상하다 ... – juba

+0

나는 이것이'% within %'의 버그라고 적당히 확신한다. 그것을보고 싶습니까, 아니면 제가해야합니까? – orizon

관련 문제