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.