[R] order() with randomised order in ties?

Rainer M Krug r.m.krug at gmail.com
Thu Jun 4 12:50:15 CEST 2009


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




More information about the R-help mailing list