Thank you Steve!
This does everything I need (at this point):
(this excludes ranges y2 from range y1)
library('intervals')
y1 = Intervals(c(-100,100))
y2 = Intervals(rbind(
c(-100.5,30),
c(0.77,10),
c(25,35),
c(70,80.3),
c(90,95)
))
interval_difference(y1,y2)
Object of class Intervals_full
3 intervals over R:
(35, 70)
(80.3, 90)
(95, 100]
PS - I'm pretty sure William's solution worked as well, but opted for the
package solution which is a bit more robust.
Thanks everyone!
Ben
On Mon, May 14, 2012 at 1:06 PM, Steve Lianoglou <
[email protected]> wrote:
> Hi all,
>
> Nice code samples presented all around.
>
> Just wanted to point out that I think the stuff found in the
> `intervals` package might also be helpful:
>
> http://cran.at.r-project.org/web/packages/intervals/index.html
>
> HTH,
> -steve
>
> On Mon, May 14, 2012 at 2:54 PM, Ben quant <[email protected]> wrote:
> > Yes, it is. I'm looking into understanding this now...
> >
> > thanks!
> > Ben
> >
> > On Mon, May 14, 2012 at 12:38 PM, William Dunlap <[email protected]>
> wrote:
> >
> >> To the list of function I sent, add another that converts a list of
> >> intervals
> >> into a Ranges object:
> >> as.Ranges.list <- function (x, ...) {
> >> stopifnot(nargs() == 1, all(vapply(x, length, 0) == 2))
> >> # use c() instead of unlist() because c() doesn't mangle POSIXct
> and
> >> Date objects
> >> x <- unname(do.call(c, x))
> >> odd <- seq(from = 1, to = length(x), by = 2)
> >> as.Ranges(bottoms = x[odd], tops = x[odd + 1])
> >> }
> >> Then stop using get() and assign() all over the place and instead make
> >> lists of
> >> related intervals and convert them to Ranges objects:
> >> > x <- as.Ranges(list(x_rng))
> >> > s <- as.Ranges(list(s1_rng, s2_rng, s3_rng, s4_rng, s5_rng))
> >> > x
> >> bottoms tops
> >> 1 -100 100
> >> > s
> >> bottoms tops
> >> 1 -250.50 30.0
> >> 2 0.77 10.0
> >> 3 25.00 35.0
> >> 4 70.00 80.3
> >> 5 90.00 95.0
> >> and then compute the difference between the sets x and s (i.e., describe
> >> the points in x but not s as a union of intervals):
> >> > setdiffRanges(x, s)
> >> bottoms tops
> >> 1 35.0 70
> >> 2 80.3 90
> >> 3 95.0 100
> >> and for a graphical check do
> >> > plot(x, s, setdiffRanges(x, s))
> >> Are those the numbers you want?
> >>
> >> I find it easier to use standard functions and data structures for this
> >> than
> >> to adapt the cumsum/order idiom to different situations.
> >>
> >> Bill Dunlap
> >> Spotfire, TIBCO Software
> >> wdunlap tibco.com
> >>
> >>
> >> > -----Original Message-----
> >> > From: [email protected] [mailto:
> [email protected]]
> >> On Behalf
> >> > Of Ben quant
> >> > Sent: Monday, May 14, 2012 11:07 AM
> >> > To: jim holtman
> >> > Cc: [email protected]
> >> > Subject: Re: [R] range segment exclusion using range endpoints
> >> >
> >> > Turns out this solution doesn't work if the s range is outside the
> range
> >> of
> >> > the x range. I didn't include that in my examples, but it is
> something I
> >> > have to deal with quite often.
> >> >
> >> > For example s1_rng below causes an issue:
> >> >
> >> > x_rng = c(-100,100)
> >> > s1_rng = c(-250.5,30)
> >> > s2_rng = c(0.77,10)
> >> > s3_rng = c(25,35)
> >> > s4_rng = c(70,80.3)
> >> > s5_rng = c(90,95)
> >> >
> >> > sNames <- grep("s[0-9]+_rng", ls(), value = TRUE)
> >> > queue <- rbind(c(x_rng[1], 1), c(x_rng[2], 1))
> >> > for (i in sNames){
> >> > queue <- rbind(queue
> >> > , c(get(i)[1], 1) # enter queue
> >> > , c(get(i)[2], -1) # exit queue
> >> > )
> >> > }
> >> > queue <- queue[order(queue[, 1]), ] # sort
> >> > queue <- cbind(queue, cumsum(queue[, 2])) # of people in the queue
> >> > for (i in which(queue[, 3] == 1)){
> >> > cat("start:", queue[i, 1L], ' end:', queue[i + 1L, 1L], "\n")
> >> > }
> >> >
> >> > Regards,
> >> >
> >> > ben
> >> > On Sat, May 12, 2012 at 12:50 PM, jim holtman <[email protected]>
> >> wrote:
> >> >
> >> > > Here is an example of how you might do it. It uses a technique of
> >> > > counting how many items are in a queue based on their arrival times;
> >> > > it can be used to also find areas of overlap.
> >> > >
> >> > > Note that it would be best to use a list for the 's' end points
> >> > >
> >> > > ================================
> >> > > > # note the next statement removes names of the format
> 's[0-9]+_rng'
> >> > > > # it would be best to create a list with the 's' endpoints, but
> this
> >> is
> >> > > > # what the OP specified
> >> > > >
> >> > > > rm(list = grep('s[0-9]+_rng', ls(), value = TRUE)) # Danger Will
> >> > > Robinson!!
> >> > > >
> >> > > > # ex 1
> >> > > > x_rng = c(-100,100)
> >> > > >
> >> > > > s1_rng = c(-25.5,30)
> >> > > > s2_rng = c(0.77,10)
> >> > > > s3_rng = c(25,35)
> >> > > > s4_rng = c(70,80.3)
> >> > > > s5_rng = c(90,95)
> >> > > >
> >> > > > # ex 2
> >> > > > # x_rng = c(-50.5,100)
> >> > > >
> >> > > > # s1_rng = c(-75.3,30)
> >> > > >
> >> > > > # ex 3
> >> > > > # x_rng = c(-75.3,30)
> >> > > >
> >> > > > # s1_rng = c(-50.5,100)
> >> > > >
> >> > > > # ex 4
> >> > > > # x_rng = c(-100,100)
> >> > > >
> >> > > > # s1_rng = c(-105,105)
> >> > > >
> >> > > > # find all the names -- USE A LIST NEXT TIME
> >> > > > sNames <- grep("s[0-9]+_rng", ls(), value = TRUE)
> >> > > >
> >> > > > # initial matrix with the 'x' endpoints
> >> > > > queue <- rbind(c(x_rng[1], 1), c(x_rng[2], 1))
> >> > > >
> >> > > > # add the 's' end points to the list
> >> > > > # this will be used to determine how many things are in a queue
> (or
> >> > > areas that
> >> > > > # overlap)
> >> > > > for (i in sNames){
> >> > > + queue <- rbind(queue
> >> > > + , c(get(i)[1], 1) # enter queue
> >> > > + , c(get(i)[2], -1) # exit queue
> >> > > + )
> >> > > + }
> >> > > > queue <- queue[order(queue[, 1]), ] # sort
> >> > > > queue <- cbind(queue, cumsum(queue[, 2])) # of people in the
> queue
> >> > > > print(queue)
> >> > > [,1] [,2] [,3]
> >> > > [1,] -100.00 1 1
> >> > > [2,] -25.50 1 2
> >> > > [3,] 0.77 1 3
> >> > > [4,] 10.00 -1 2
> >> > > [5,] 25.00 1 3
> >> > > [6,] 30.00 -1 2
> >> > > [7,] 35.00 -1 1
> >> > > [8,] 70.00 1 2
> >> > > [9,] 80.30 -1 1
> >> > > [10,] 90.00 1 2
> >> > > [11,] 95.00 -1 1
> >> > > [12,] 100.00 1 2
> >> > > >
> >> > > > # print out values where the last column is 1
> >> > > > for (i in which(queue[, 3] == 1)){
> >> > > + cat("start:", queue[i, 1L], ' end:', queue[i + 1L, 1L], "\n")
> >> > > + }
> >> > > start: -100 end: -25.5
> >> > > start: 35 end: 70
> >> > > start: 80.3 end: 90
> >> > > start: 95 end: 100
> >> > > >
> >> > > >
> >> > > =========================================
> >> > >
> >> > > On Sat, May 12, 2012 at 1:54 PM, Ben quant <[email protected]>
> wrote:
> >> > > > Hello,
> >> > > >
> >> > > > I'm posting this again (with some small edits). I didn't get any
> >> replies
> >> > > > last time...hoping for some this time. :)
> >> > > >
> >> > > > Currently I'm only coming up with brute force solutions to this
> issue
> >> > > > (loops). I'm wondering if anyone has a better way to do this.
> Thank
> >> you
> >> > > for
> >> > > > your help in advance!
> >> > > >
> >> > > > The problem: I have endpoints of one x range (x_rng) and an
> unknown
> >> > > number
> >> > > > of s ranges (s[#]_rng) also defined by the range endpoints. I'd
> like
> >> to
> >> > > > remove the x ranges that overlap with the s ranges. The examples
> >> below
> >> > > > demonstrate what I mean.
> >> > > >
> >> > > > What is the best way to do this?
> >> > > >
> >> > > > Ex 1.
> >> > > > For:
> >> > > > x_rng = c(-100,100)
> >> > > >
> >> > > > s1_rng = c(-25.5,30)
> >> > > > s2_rng = c(0.77,10)
> >> > > > s3_rng = c(25,35)
> >> > > > s4_rng = c(70,80.3)
> >> > > > s5_rng = c(90,95)
> >> > > >
> >> > > > I would get:
> >> > > > -100,-25.5
> >> > > > 35,70
> >> > > > 80.3,90
> >> > > > 95,100
> >> > > >
> >> > > > Ex 2.
> >> > > > For:
> >> > > > x_rng = c(-50.5,100)
> >> > > >
> >> > > > s1_rng = c(-75.3,30)
> >> > > >
> >> > > > I would get:
> >> > > > 30,100
> >> > > >
> >> > > > Ex 3.
> >> > > > For:
> >> > > > x_rng = c(-75.3,30)
> >> > > >
> >> > > > s1_rng = c(-50.5,100)
> >> > > >
> >> > > > I would get:
> >> > > > -75.3,-50.5
> >> > > >
> >> > > > Ex 4.
> >> > > > For:
> >> > > > x_rng = c(-100,100)
> >> > > >
> >> > > > s1_rng = c(-105,105)
> >> > > >
> >> > > > I would get something like:
> >> > > > NA,NA
> >> > > > or...
> >> > > > NA
> >> > > >
> >> > > > Ex 5.
> >> > > > For:
> >> > > > x_rng = c(-100,100)
> >> > > >
> >> > > > s1_rng = c(-100,100)
> >> > > >
> >> > > > I would get something like:
> >> > > > -100,-100
> >> > > > 100,100
> >> > > > or just...
> >> > > > -100
> >> > > > 100
> >> > > >
> >> > > > PS - You may have noticed that in all of the examples I am
> including
> >> the
> >> > > s
> >> > > > range endpoints in the desired results, which I can deal with
> later
> >> in my
> >> > > > program so its not a problem... I think leaving in the s range
> >> endpoints
> >> > > > simplifies the problem.
> >> > > >
> >> > > > Thanks!
> >> > > > Ben
> >> > > >
> >> > > > [[alternative HTML version deleted]]
> >> > > >
> >> > > > ______________________________________________
> >> > > > [email protected] mailing list
> >> > > > https://stat.ethz.ch/mailman/listinfo/r-help
> >> > > > PLEASE do read the posting guide
> >> > > http://www.R-project.org/posting-guide.html
> >> > > > and provide commented, minimal, self-contained, reproducible code.
> >> > >
> >> > >
> >> > >
> >> > > --
> >> > > Jim Holtman
> >> > > Data Munger Guru
> >> > >
> >> > > What is the problem that you are trying to solve?
> >> > > Tell me what you want to do, not how you want to do it.
> >> > >
> >> >
> >> > [[alternative HTML version deleted]]
> >> >
> >> > ______________________________________________
> >> > [email protected] mailing list
> >> > https://stat.ethz.ch/mailman/listinfo/r-help
> >> > PLEASE do read the posting guide
> >> http://www.R-project.org/posting-guide.html
> >> > and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> > [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > [email protected] mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
>
>
>
> --
> Steve Lianoglou
> Graduate Student: Computational Systems Biology
> | Memorial Sloan-Kettering Cancer Center
> | Weill Medical College of Cornell University
> Contact Info: http://cbio.mskcc.org/~lianos/contact
>
[[alternative HTML version deleted]]
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.