2010-11-03 13 views
5

mam ramkę danych ze 900000 rzędów i 11 kolumn R. Nazwy i typy kolumn są następujące:sortowanie danych w R

column name: date/mcode/mname/ycode/yname/yissue/bsent /breturn/tsent /treturn/csales 
type:  Date/Char/Char/Char/Char/Numeric/Numeric/Numeric/Numeric/Numeric/Numeric 

I Do sortowania danych według tych zmiennych w następującej kolejności :

  1. data
  2. mcode
  3. ycode
  4. yissue

Kolejność poziomów jest tutaj ważna, tzn. Powinny być najpierw posortowane według daty, a jeśli istnieją identyczne daty, powinny być posortowane według kodu m, tak i tak dalej. Jak mogę to zrobić w R?

+2

przeczytaniu pierwszego akapitu 'pomoc (sort) 'odpowiada na twoje pytanie. –

+1

Po uzyskaniu odpowiedzi poniżej, jestem pewien, że postąpiłem słusznie. I ♥ Stack Overflow. –

Odpowiedz

10

Być może coś takiego?

> df<- data.frame(a=rev(1:10), b=rep(c(2,1),5), c=rnorm(10)) 
> df 
    a b   c 
1 10 2 -0.85212079 
2 9 1 -0.46199463 
3 8 2 -1.52374565 
4 7 1 0.28904717 
5 6 2 -0.91609012 
6 5 1 1.60448783 
7 4 2 0.51249796 
8 3 1 -1.35119089 
9 2 2 -0.55497745 
10 1 1 -0.05723538 
> with(df, df[order(a, b, c), ]) 
    a b   c 
10 1 1 -0.05723538 
9 2 2 -0.55497745 
8 3 1 -1.35119089 
7 4 2 0.51249796 
6 5 1 1.60448783 
5 6 2 -0.91609012 
4 7 1 0.28904717 
3 8 2 -1.52374565 
2 9 1 -0.46199463 
1 10 2 -0.85212079 

Funkcja "porządek" może przyjmować kilka wektorów jako argumentów.

+5

możesz również przedrostkiem argumentu do zamówienia za pomocą - aby posortować rosnąco, zamiast zejść tylko dla tego kryterium, np. Zamówienie (df $ b, -df $ a, df $ c). – caracal

+0

ładny, świetny dodatek – jbremnant

8

W oparciu o wcześniejsze rozwiązanie, oto dwa inne podejścia. drugie podejście wymaga plyr.

df.sorted = df[do.call(order, df[names(df)]),]; 
df.sorted = arrange(df, a, b, c) 
4

jeśli żadna z powyższych odpowiedzi zapalić ogień zawsze można skorzystać z funkcji orderBy() z pakietu Doby:

require(doBy) 
sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData) 

Jak można intuicyjnie oczekiwać, można umieścić znak minus przed dowolna zmienna, aby posortować ją w dół.

Nie ma nic magicznego w orderBy(). Jak stwierdza dokumentacja, jest to funkcja "wrapper dla funkcji order()" - istotną różnicą jest to, że zmienne do zamówienia można podać za pomocą formuły modelu. "

Uważam, że składnia jest łatwiejsza do zapamiętania.

1

Dodatkowe uwagi: używać -c(), aby odwrócić czynnik rodzaj lub charakter kolumn

with(df, df[order(a, b, -c(myCharCol)), ]) 

Ponadto można dodawać wektor wybrać tylko niektóre kolumny

with(df, df[order(a, b, c), c('a','b','x','y')]) 
Powiązane problemy