# [R] sort a data.frame

Kevin Wright kw.stat at gmail.com
Fri May 21 15:12:38 CEST 2010

```Also see mixedsort and mixedorder in the gtools package.

dd <- data.frame(b = c("chr2", "chr1", "chr15", "chr13"),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
dd[gtools::mixedorder(dd\$b),]

R>       b x y z
2  chr1 D 3 1
1  chr2 A 8 1
4 chr13 C 9 2
3 chr15 A 9 1

Kevin Wright

On Fri, May 21, 2010 at 7:56 AM, David Winsemius <dwinsemius at comcast.net> wrote:
> But you should both be warned that would only be correct for a species where
> there were 24  chromosomes. This would work for humans and species with a
> higher number:
>
> dd[ order(as.numeric(substring(dd\$b, 4), substring(dd\$b, 4))), ]
>
> --
> David Winsemius, MD
> West Hartford, CT
>
>
> On May 20, 2010, at 10:24 PM, Jorge Ivan Velez wrote:
>
>> Hi Yuan,
>>
>> One way would be:
>>
>> dd[order(factor(substring(dd\$b, 4), levels = c(1:22, LETTERS[1:25]))),]
>>
>> HTH,
>> Jorge
>>
>>
>> On Thu, May 20, 2010 at 10:18 PM, Yuan Jian <> wrote:
>>
>>> it's a excellent solution. I am sorry I missed something in my question.
>>> the column b consists of not only number but also one letter after "chr",
>>> for example chrX, chrY. I want to put them after number but in the order
>>> of
>>> ASCII.
>>> i.e. chr1<chr2<....<chr9<chr10<...<chr22<chrA<...chrX<chrY
>>>
>>> if I have dataframe
>>> dd <- data.frame(b = c("chr2", "chr1", "chrY", "chr13", "chrX"),
>>>     x = c("A", "D", "A", "C", "C"), y = c(8, 3, 9, 9,7),
>>>      z = c(1, 1, 1, 2, 8))
>>>
>>> the expected result
>>>
>>>      b x y z
>>> 1  chr1 D 3 1
>>> 2  chr2 A 8 1
>>> 3  chr13 C 9 2
>>> 4  chrX C 7 8
>>> 5  chrY A 9 1
>>>
>>>
>>>
>>>
>>>
>>> --- On *Thu, 20/5/10, Jorge Ivan Velez <jorgeivanvelez at gmail.com>* wrote:
>>>
>>>
>>> From: Jorge Ivan Velez <jorgeivanvelez at gmail.com>
>>> Subject: Re: [R] sort a data.frame
>>> To: "Yuan Jian" <jayuan2008 at yahoo.com>
>>> Cc: r-help at r-project.org
>>> Received: Thursday, 20 May, 2010, 1:31 PM
>>>
>>>
>>> Hi Yuan,
>>>
>>> Try
>>>
>>> dd[order(as.numeric(gsub("[^0-9]", "", dd\$b))), ]
>>>
>>> HTH,
>>> Jorge
>>>
>>> On Thu, May 20, 2010 at 8:28 AM, Yuan Jian <> wrote:
>>>
>>>> Hello,
>>>>
>>>> I have a dataframe:
>>>> dd <- data.frame(b = c("chr2", "chr1", "chr15", "chr13"),
>>>>     x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
>>>>      z = c(1, 1, 1, 2))
>>>>
>>>>> dd
>>>>
>>>>     b x y z
>>>> 1  chr2 A 8 1
>>>> 2  chr1 D 3 1
>>>> 3 chr15 A 9 1
>>>> 4 chr13 C 9 2
>>>>
>>>> Now I want to sort them according column "b", but only its number is
>>>> considered:
>>>>     b x y z
>>>> 1  chr1 D 3 1
>>>> 2 chr13 C 9 2
>>>> 3 chr15 A 9 1
>>>> 4  chr2 A 8 1
>>>>
>>>> thanks
>>>> jian
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help