Hello, I have a vector with positive integer numbers, e.g.> numbers <- c(1,2,1,2,3,4,5)and want to split the vector whenever an element in the vector is smaller or equal to its predecessor. Hence I want to obtain two vectors: c(1,2) and c(1,2,3,4,5). I tried with which(), but it is not so elegant:> numbers[1:(which(numbers<=numbers[1])[2]-1)] > numbers[which(numbers<=numbers[1])[2]:length(numbers)]Sure I can do it with a for-loop, but that seems a bit tedious for that small problem. Does maybe anyone know a simple and elegant solution for this? I'm searching for a general solution, since my vector may change and maybe be split into more than two vectors, e.g. give five vectors for c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5). Many thanks in advance, Hannes -- View this message in context: http://r.789695.n4.nabble.com/splitting-a-vector-tp4638675.html Sent from the R help mailing list archive at Nabble.com.
Hello, Try the following. fun <- function(x){ n.diff <- cumsum(diff(c(x[1], x)) <= 0) split(x, n.diff) } numbers <- c(1,2,1,2,3,4,5) fun(numbers) fun( c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5) ) Hope this helps, Rui Barradas Em 01-08-2012 14:29, capy_bara escreveu:> Hello, > > I have a vector with positive integer numbers, e.g. > >> numbers <- c(1,2,1,2,3,4,5) > and want to split the vector whenever an element in the vector is smaller or > equal to its predecessor. > Hence I want to obtain two vectors: c(1,2) and c(1,2,3,4,5). > I tried with which(), but it is not so elegant: > >> numbers[1:(which(numbers<=numbers[1])[2]-1)] >> numbers[which(numbers<=numbers[1])[2]:length(numbers)] > Sure I can do it with a for-loop, but that seems a bit tedious for that > small problem. > Does maybe anyone know a simple and elegant solution for this? I'm searching > for a general solution, since > my vector may change and maybe be split into more than two vectors, e.g. > give five vectors for c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5). > > Many thanks in advance, > > Hannes > > > > > > > > -- > View this message in context: http://r.789695.n4.nabble.com/splitting-a-vector-tp4638675.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org 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.
The following 'f' counts the number of times the sequence x does not increase. Is this what you want?> f <- function(x) split(x, cumsum(c(TRUE, x[-1] <= x[-length(x)]))) > f(numbers)$`1` [1] 1 2 $`2` [1] 1 2 3 4 5> f(c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5))$`1` [1] 1 $`2` [1] 1 2 3 4 5 $`3` [1] 1 2 3 $`4` [1] 2 3 4 5 6 $`5` [1] 4 5 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf > Of capy_bara > Sent: Wednesday, August 01, 2012 6:30 AM > To: r-help at r-project.org > Subject: [R] splitting a vector > > Hello, > > I have a vector with positive integer numbers, e.g. > > > numbers <- c(1,2,1,2,3,4,5) > > and want to split the vector whenever an element in the vector is smaller or > equal to its predecessor. > Hence I want to obtain two vectors: c(1,2) and c(1,2,3,4,5). > I tried with which(), but it is not so elegant: > > > numbers[1:(which(numbers<=numbers[1])[2]-1)] > > numbers[which(numbers<=numbers[1])[2]:length(numbers)] > > Sure I can do it with a for-loop, but that seems a bit tedious for that > small problem. > Does maybe anyone know a simple and elegant solution for this? I'm searching > for a general solution, since > my vector may change and maybe be split into more than two vectors, e.g. > give five vectors for c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5). > > Many thanks in advance, > > Hannes > > > > > > > > -- > View this message in context: http://r.789695.n4.nabble.com/splitting-a-vector- > tp4638675.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org 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.
I come up with: runs <- function(numbers) { tmp <- diff(c(0, which(diff(numbers) <= 0), length(numbers))) split(numbers, rep(seq_along(tmp), tmp)) } Can't say it's elegant, but it seems to work> runs(c(1:3, 1:4))$`1` [1] 1 2 3 $`2` [1] 1 2 3 4> runs(c(1,1,1))$`1` [1] 1 $`2` [1] 1 $`3` [1] 1> runs(c(1:3, 2:3, 3))$`1` [1] 1 2 3 $`2` [1] 2 3 $`3` [1] 3 HTH, Jan capy_bara <hettling at few.vu.nl> schreef:> Hello, > > I have a vector with positive integer numbers, e.g. > >> numbers <- c(1,2,1,2,3,4,5) > > and want to split the vector whenever an element in the vector is smaller or > equal to its predecessor. > Hence I want to obtain two vectors: c(1,2) and c(1,2,3,4,5). > I tried with which(), but it is not so elegant: > >> numbers[1:(which(numbers<=numbers[1])[2]-1)] >> numbers[which(numbers<=numbers[1])[2]:length(numbers)] > > Sure I can do it with a for-loop, but that seems a bit tedious for that > small problem. > Does maybe anyone know a simple and elegant solution for this? I'm searching > for a general solution, since > my vector may change and maybe be split into more than two vectors, e.g. > give five vectors for c(1,1,2,3,4,5,1,2,3,2,3,4,5,6,4,5). > > Many thanks in advance, > > Hannes > > > > > > > > -- > View this message in context: > http://r.789695.n4.nabble.com/splitting-a-vector-tp4638675.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org 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.
Seemingly Similar Threads
- multi-panel figure: overall title for each row
- single, double or no quotes in expression
- [LLVMdev] llvm.loop metadata placement and critical edge splitting
- [PATCH RFC v2 02/24] scsi: allocate separate queue for reserved commands
- [PATCH RFC v2 02/24] scsi: allocate separate queue for reserved commands