2012-10-31 5 views
20
data = c(1,2,3,4) 
names = c("foo", "bar", "baz", "yak") 
d = data.frame(data, row.names=names) 

ta zwraca:Jak mogę posortować dane.frame za pomocą tylko jednej kolumny, bez utraty rownów?

data 
foo 1 
bar 2 
baz 3 
yak 4 

Teraz chciałbym uporządkować ten dataframe przez kolumnę, bez utraty nazwy wierszy w załączeniu. Tak, mój wynik byłby:

data 
yak 4 
baz 3 
bar 2 
foo 1 

Ja już próbowałem następujące:

  • d[order(-d$data),], co oczywiście tylko daje mi listę jednowymiarowy.

  • arrange(d, desc(data)) z pakietu plyr, w którym nazwy rzędów zostają usunięte.

  • Sprawdzaj kolejność z o = order(-d$data), a następnie odtworzyć ramkę z

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

    ... który wciąż pozostawia mnie z niewłaściwej nazwy kolumny.

Czy jest jakiś rozsądny sposób to zrobić?

Odpowiedz

29

Byłaś blisko ze swojej pierwszej próbie, po prostu zapomniał o używaniu drop = FALSE:

> d[order(-d$data), , drop = FALSE] 
    data 
yak 4 
baz 3 
bar 2 
foo 1 
+0

Ach, ciekawe. Jakoś nie dowiedziałem się o tym dopiero po przeczytaniu słowa kluczowego "upuść" tutaj, co teraz pozwala mi myśleć, czy pomijanie wymiarów R jest dobrym pomysłem, czy nie. Przeczytam o tym. – slhck

+1

Myślę, że wszyscy już zadali to pytanie. Konsensus bogów R był taki, że to domyślne ustawienie nie było tak dobre, ale nie można go zmienić bez przestarzałego kodu. Zostanie poprawiony w Q. –

+0

Kiedy używam tego rozwiązania, odfiltrowuję wszystkie moje wiersze oprócz jednego. Jak to się stało? – Kory

Powiązane problemy