Эксклюзивные временные интервалы в лубридате R

Возьмите два интервала: [1,6) и [6,12). Число 6 принадлежит второму, но не первому. Можно ли сделать то же самое в лубридате? (Это решает проблему в Python ...)

library(lubridate)
date1 <- ymd(20010101); date3 <- ymd(20010103); date6 <- ymd(20010106); date12 <- ymd(20010112)
intA <- new_interval(date1, date6); intB <- new_interval(date6, date12)
date3 %within% intA
> TRUE
date3 %within% intB
> FALSE
date6 %within% intB ## I want this to be true
> TRUE
date6 %within% intA ## but this be false...
> TRUE

Можно ли настроить функцию% в%, чтобы исключить верхние границы интервалов?

Любая помощь будет высоко ценится.


person emagar    schedule 03.12.2014    source источник


Ответы (2)


Конечно. Я поискал lubridate на github, где определено %within%. Пара настроек кода (изменение <= на <):

"%my_within%" <- function(a,b) standardGeneric("%my_within%")
setGeneric("%my_within%")

setMethod("%my_within%", signature(b = "Interval"), function(a,b){
    if(!is.instant(a)) stop("Argument 1 is not a recognized date-time")
    a <- as.POSIXct(a)
    (as.numeric(a) - as.numeric(b@start) < [email protected]) & (as.numeric(a) - as.numeric(b@start) >= 0)
})

setMethod("%my_within%", signature(a = "Interval", b = "Interval"), function(a,b){
    a <- int_standardize(a)
    b <- int_standardize(b)
    start.in <- as.numeric(a@start) >= as.numeric(b@start) 
    end.in <- (as.numeric(a@start) + [email protected]) < (as.numeric(b@start) + [email protected])
    start.in & end.in
})

date3 %my_within% intA
> TRUE
date3 %my_within% intB
> FALSE
date6 %my_within% intB ## I want this to be true
> TRUE
date6 %my_within% intA ## False, as desired!
> FALSE
person Gregor Thomas    schedule 03.12.2014

Вы можете определить интервал intA, заканчивающийся за 1 секунду до date6:

   intA <- new_interval(date1, date6-1)
   date6 %within% intA 
   #[1] FALSE
person nicola    schedule 03.12.2014