How can I sort a data.frame with only one column, without losing rownames?

22,606

You were close with your first attempt, just forgot about using drop = FALSE:

> d[order(-d$data), , drop = FALSE]
    data
yak    4
baz    3
bar    2
foo    1
Share:
22,606
slhck
Author by

slhck

Video quality guy and researcher, PhD student in computer science. Founder/CEO of AVEQ. I offer personal consulting and help with video encoding, especially with FFmpeg. Send a mail to werner.robitza at gmail.com. More info on my website.

Updated on November 01, 2020

Comments

  • slhck
    slhck over 3 years
    data = c(1,2,3,4)
    names = c("foo", "bar", "baz", "yak")
    d = data.frame(data, row.names=names)
    

    This returns:

        data
    foo    1
    bar    2
    baz    3
    yak    4
    

    Now, I'd like to sort this dataframe by the column, without losing the row names attached. So, my result would be:

        data
    yak    4
    baz    3
    bar    2
    foo    1
    

    I've already tried the following:

    • d[order(-d$data),], which of course only gives me the one-dimensional list.

    • arrange(d, desc(data)) from the plyr package, which drops the row names.

    • Find out the order with o = order(-d$data), then reconstruct the frame with

      data.frame(d[o,], row.names=rownames(d)[o])
      

      … which still leaves me with the wrong column name.

    Is there any sane way to do this?

  • slhck
    slhck over 11 years
    Ah, interesting. I somehow didn't find out about this only after reading the keyword "drop" here, which now makes me think whether R dropping dimensions is a good idea or not. I'll read up on that.
  • Dieter Menne
    Dieter Menne over 11 years
    I think everyone has already asked this question. The consensus of the R gods was that this default was not so good, but that it cannot be changed without obsoleting most existing code. Will be corrected in Q.
  • Kory
    Kory almost 9 years
    When I use this solution I filter out all of my rows but one. How did this happen?