Hi I want to use order() to get the order of a vector. But I would need a different behavior when ties occur: similar to the parameter ties.method = "random" in the rank() function, I would need to randomise the ties. Is this possible? Example: x <- rep(1:10, 2) order(x) [1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 order(x) [1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 ## I would need different "order" for the ties, as below in rank() example: rank(x, ties.method="random") [1] 1 4 6 7 10 12 13 15 18 19 2 3 5 8 9 11 14 16 17 20> rank(x, ties.method="random")[1] 2 4 5 7 9 12 14 15 18 19 1 3 6 8 10 11 13 16 17 20 Thanks Rainer -- Rainer M. Krug, Centre of Excellence for Invasion Biology, Stellenbosch University, South Africa
Sorry for replying to my own post, but I found a solution. Still, a more elegant solution would be preferred. On Thu, Jun 4, 2009 at 12:02 PM, Rainer M Krug <r.m.krug at gmail.com> wrote:> Hi > > I want to use order() to get the order of a vector. > > But I would need a different behavior when ties occur: similar to the > parameter ?ties.method = "random" in the rank() function, I would need > to randomise the ties. Is this possible?The solution is to randomize the vector before submitting to order(): x <- rep(1:10, 2) iS <- sample( length(x) ) o <- order( x[iS], na.last=NA, decreasing=TRUE) o [1] 8 16 12 17 2 9 7 15 10 11 4 14 3 5 13 20 1 6 18 19 x[iS][o] [1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 iS <- sample( length(x) ) o <- order( x[iS], na.last=NA, decreasing=TRUE) o [1] 14 19 13 20 2 18 3 10 1 15 4 9 11 12 6 7 8 16 5 17> x[iS][o][1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 Thanks Rainer> Example: > > x <- rep(1:10, 2) > order(x) > ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 > order(x) > ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 > > ## I would need different "order" for the ties, as below in rank() example: > > rank(x, ties.method="random") > ?[1] ?1 ?4 ?6 ?7 10 12 13 15 18 19 ?2 ?3 ?5 ?8 ?9 11 14 16 17 20 >> rank(x, ties.method="random") > ?[1] ?2 ?4 ?5 ?7 ?9 12 14 15 18 19 ?1 ?3 ?6 ?8 10 11 13 16 17 20 > > > Thanks > > Rainer > > -- > Rainer M. Krug, Centre of Excellence for Invasion Biology, > Stellenbosch University, South Africa >-- Rainer M. Krug, Centre of Excellence for Invasion Biology, Stellenbosch University, South Africa
How about: order(x, runif(length(x))) Patrick Burns patrick at burns-stat.com +44 (0)20 8525 0696 http://www.burns-stat.com (home of "The R Inferno" and "A Guide for the Unwilling S User") Rainer M Krug wrote:> Sorry for replying to my own post, but I found a solution. Still, a > more elegant solution would be preferred. > > On Thu, Jun 4, 2009 at 12:02 PM, Rainer M Krug <r.m.krug at gmail.com> wrote: >> Hi >> >> I want to use order() to get the order of a vector. >> >> But I would need a different behavior when ties occur: similar to the >> parameter ties.method = "random" in the rank() function, I would need >> to randomise the ties. Is this possible? > > The solution is to randomize the vector before submitting to order(): > > x <- rep(1:10, 2) > > iS <- sample( length(x) ) > o <- order( x[iS], na.last=NA, decreasing=TRUE) > o > [1] 8 16 12 17 2 9 7 15 10 11 4 14 3 5 13 20 1 6 18 19 > x[iS][o] > [1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 > > iS <- sample( length(x) ) > o <- order( x[iS], na.last=NA, decreasing=TRUE) > o > [1] 14 19 13 20 2 18 3 10 1 15 4 9 11 12 6 7 8 16 5 17 >> x[iS][o] > [1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 > > > Thanks > > Rainer > >> Example: >> >> x <- rep(1:10, 2) >> order(x) >> [1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 >> order(x) >> [1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 >> >> ## I would need different "order" for the ties, as below in rank() example: >> >> rank(x, ties.method="random") >> [1] 1 4 6 7 10 12 13 15 18 19 2 3 5 8 9 11 14 16 17 20 >>> rank(x, ties.method="random") >> [1] 2 4 5 7 9 12 14 15 18 19 1 3 6 8 10 11 13 16 17 20 >> >> >> Thanks >> >> Rainer >> >> -- >> Rainer M. Krug, Centre of Excellence for Invasion Biology, >> Stellenbosch University, South Africa >> > > >
On Thu, Jun 4, 2009 at 12:36 PM, Patrick Burns <pburns at pburns.seanet.com> wrote:> How about: > > order(x, runif(length(x)))Thanks - that is really elegant. Rainer> > > > Patrick Burns > patrick at burns-stat.com > +44 (0)20 8525 0696 > http://www.burns-stat.com > (home of "The R Inferno" and "A Guide for the Unwilling S User") > > Rainer M Krug wrote: >> >> Sorry for replying to my own post, but I found a solution. Still, a >> more elegant solution would be preferred. >> >> On Thu, Jun 4, 2009 at 12:02 PM, Rainer M Krug <r.m.krug at gmail.com> wrote: >>> >>> Hi >>> >>> I want to use order() to get the order of a vector. >>> >>> But I would need a different behavior when ties occur: similar to the >>> parameter ?ties.method = "random" in the rank() function, I would need >>> to randomise the ties. Is this possible? >> >> The solution is to randomize the vector before submitting to order(): >> >> x <- rep(1:10, 2) >> >> iS <- sample( length(x) ) >> o <- order( x[iS], na.last=NA, decreasing=TRUE) >> o >> ?[1] ?8 16 12 17 ?2 ?9 ?7 15 10 11 ?4 14 ?3 ?5 13 20 ?1 ?6 18 19 >> x[iS][o] >> ?[1] 10 10 ?9 ?9 ?8 ?8 ?7 ?7 ?6 ?6 ?5 ?5 ?4 ?4 ?3 ?3 ?2 ?2 ?1 ?1 >> >> iS <- sample( length(x) ) >> o <- order( x[iS], na.last=NA, decreasing=TRUE) >> o >> ?[1] 14 19 13 20 ?2 18 ?3 10 ?1 15 ?4 ?9 11 12 ?6 ?7 ?8 16 ?5 17 >>> >>> x[iS][o] >> >> ?[1] 10 10 ?9 ?9 ?8 ?8 ?7 ?7 ?6 ?6 ?5 ?5 ?4 ?4 ?3 ?3 ?2 ?2 ?1 ?1 >> >> >> Thanks >> >> Rainer >> >>> Example: >>> >>> x <- rep(1:10, 2) >>> order(x) >>> ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 >>> order(x) >>> ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 >>> >>> ## I would need different "order" for the ties, as below in rank() >>> example: >>> >>> rank(x, ties.method="random") >>> ?[1] ?1 ?4 ?6 ?7 10 12 13 15 18 19 ?2 ?3 ?5 ?8 ?9 11 14 16 17 20 >>>> >>>> rank(x, ties.method="random") >>> >>> ?[1] ?2 ?4 ?5 ?7 ?9 12 14 15 18 19 ?1 ?3 ?6 ?8 10 11 13 16 17 20 >>> >>> >>> Thanks >>> >>> Rainer >>> >>> -- >>> Rainer M. Krug, Centre of Excellence for Invasion Biology, >>> Stellenbosch University, South Africa >>> >> >> >> >-- Rainer M. Krug, Centre of Excellence for Invasion Biology, Stellenbosch University, South Africa
On Thu, Jun 4, 2009 at 12:45 PM, Rainer M Krug <r.m.krug at gmail.com> wrote:> On Thu, Jun 4, 2009 at 12:36 PM, Patrick Burns <pburns at pburns.seanet.com> wrote: >> How about: >> >> order(x, runif(length(x))) > > Thanks - that is really elegant.One thing: it is saver to use sample(length(x)) instead of runif(length(x)), as runif() might also produce ties. It is quite unlikely that those result in ties for both vectors, but not impossible. That problem is avoided with sample(length(x)) Rainer> > Rainer > >> >> >> >> Patrick Burns >> patrick at burns-stat.com >> +44 (0)20 8525 0696 >> http://www.burns-stat.com >> (home of "The R Inferno" and "A Guide for the Unwilling S User") >> >> Rainer M Krug wrote: >>> >>> Sorry for replying to my own post, but I found a solution. Still, a >>> more elegant solution would be preferred. >>> >>> On Thu, Jun 4, 2009 at 12:02 PM, Rainer M Krug <r.m.krug at gmail.com> wrote: >>>> >>>> Hi >>>> >>>> I want to use order() to get the order of a vector. >>>> >>>> But I would need a different behavior when ties occur: similar to the >>>> parameter ?ties.method = "random" in the rank() function, I would need >>>> to randomise the ties. Is this possible? >>> >>> The solution is to randomize the vector before submitting to order(): >>> >>> x <- rep(1:10, 2) >>> >>> iS <- sample( length(x) ) >>> o <- order( x[iS], na.last=NA, decreasing=TRUE) >>> o >>> ?[1] ?8 16 12 17 ?2 ?9 ?7 15 10 11 ?4 14 ?3 ?5 13 20 ?1 ?6 18 19 >>> x[iS][o] >>> ?[1] 10 10 ?9 ?9 ?8 ?8 ?7 ?7 ?6 ?6 ?5 ?5 ?4 ?4 ?3 ?3 ?2 ?2 ?1 ?1 >>> >>> iS <- sample( length(x) ) >>> o <- order( x[iS], na.last=NA, decreasing=TRUE) >>> o >>> ?[1] 14 19 13 20 ?2 18 ?3 10 ?1 15 ?4 ?9 11 12 ?6 ?7 ?8 16 ?5 17 >>>> >>>> x[iS][o] >>> >>> ?[1] 10 10 ?9 ?9 ?8 ?8 ?7 ?7 ?6 ?6 ?5 ?5 ?4 ?4 ?3 ?3 ?2 ?2 ?1 ?1 >>> >>> >>> Thanks >>> >>> Rainer >>> >>>> Example: >>>> >>>> x <- rep(1:10, 2) >>>> order(x) >>>> ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 >>>> order(x) >>>> ?[1] ?1 11 ?2 12 ?3 13 ?4 14 ?5 15 ?6 16 ?7 17 ?8 18 ?9 19 10 20 >>>> >>>> ## I would need different "order" for the ties, as below in rank() >>>> example: >>>> >>>> rank(x, ties.method="random") >>>> ?[1] ?1 ?4 ?6 ?7 10 12 13 15 18 19 ?2 ?3 ?5 ?8 ?9 11 14 16 17 20 >>>>> >>>>> rank(x, ties.method="random") >>>> >>>> ?[1] ?2 ?4 ?5 ?7 ?9 12 14 15 18 19 ?1 ?3 ?6 ?8 10 11 13 16 17 20 >>>> >>>> >>>> Thanks >>>> >>>> Rainer >>>> >>>> -- >>>> Rainer M. Krug, Centre of Excellence for Invasion Biology, >>>> Stellenbosch University, South Africa >>>> >>> >>> >>> >> > > > > -- > Rainer M. Krug, Centre of Excellence for Invasion Biology, > Stellenbosch University, South Africa >-- Rainer M. Krug, Centre of Excellence for Invasion Biology, Stellenbosch University, South Africa