Find all date ranges for overlapping start and end dates in R

后端 未结 3 585
再見小時候
再見小時候 2020-12-06 08:35

I have a data frame that looks like this:

w<-read.table(header=TRUE,text=\"
start.date   end.date
2006-06-26 2006-07-24
2006-07-19 2006-08-16
2007-06-09 2         


        
3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-06 09:03

    Solution.

    w<-read.table(header=TRUE, stringsAsFactor=F, text="
    start.date   end.date
    2006-06-26 2006-07-24
    2006-07-19 2006-08-16
    2007-06-09 2007-07-07
    2007-06-24 2007-07-22
    2007-07-03 2007-07-31
    2007-08-04 2007-09-01
    2007-08-07 2007-09-04
    2007-09-05 2007-10-03
    2007-09-14 2007-10-12
    2007-10-19 2007-11-16
    2007-11-17 2007-12-15
    2008-06-18 2008-07-16
    2008-06-28 2008-07-26
    2008-07-11 2008-08-08
    2008-07-23 2008-08-20")
    
    w <- data.frame(lapply(w, as.Date))
    
    library(lubridate)
    
    idx.rle <- rle(as.numeric(sapply(1:(nrow(w)-1), function(i) int_overlaps(interval(w[i,1],w[i,2]), interval(w[i+1,1],w[i+1,2])))))
    
    
    
    
    i.starts <- nrow(w)-rev(cumsum(rev(idx.rle$length)))
    i.ends <-  1+cumsum(idx.rle$length)
    
     do.call(rbind,
        lapply(1:length(idx.rle$lengths),
               function(i) {
                   i.start <- i.starts[i]
                   i.end <-  i.ends[i]
                   if(idx.rle$values[i]==1) {
                       d <- data.frame(start.date=w[i.start,1],
                                       end.date=max(w[i.start:i.end,2]) );
                       names(d) <- names(w);
                       d
                   } else {
                       if(idx.rle$lengths[i]>1&i>1&i=1&i==1) {
                               data.frame(w[(i.start):(i.end-1),])
                           } else {
                               if(idx.rle$lengths[i]>=1&i==length(idx.rle$lengths)) data.frame(w[(i.start+1):(i.end),] ) 
                           }
                       }
                   }
               }))
    

提交回复
热议问题