2010-11-12 10 views
7

Powiedzmy mam data.frameJak sortować ramkę danych w R z zachowaniem określonej kolejności kolumn?

x <- data.frame(a = c('A','A','A','A','A', 'C','C','C','C', 'B','B','B'), 
       b = c('a','c','a','a','c', 'd', 'e','e','d', 'b','b','b'), 
       c = c(7, 3, 2, 4, 5, 3, 1, 1, 5, 5, 2, 3), 
       stringsAsFactors = FALSE) 

> x 
    a b c 
1 A a 7 
2 A c 3 
3 A a 2 
4 A a 4 
5 A c 5 
6 C d 3 
7 C e 1 
8 C e 1 
9 C d 5 
10 B b 5 
11 B b 2 
12 B b 3 

chciałbym uporządkować x kolumnach B i C, ale utrzymanie porządku od a jak wcześniej. x[order(x$b, x$c),] - porządek z podziałem na kolumny a. Właśnie tego chcę:

a b c 
3 A a 2 
4 A a 4 
1 A a 7 
2 A c 3 
5 A c 5 
6 C d 3 
9 C d 5 
7 C e 1 
8 C e 1 
11 B b 2 
12 B b 3 
10 B b 5 

Czy jest to szybki sposób na zrobienie tego?

Obecnie uruchamiam pętlę "dla" i sortuję każdy podzbiór, jestem pewien, że musi istnieć lepszy sposób.

Dziękujemy! Ilya

Odpowiedz

7

Jeśli kolumna „a” jest już uporządkowane, a następnie jej ta prosta:

> x[order(x$a,x$b, x$c),] 
    a b c 
3 A a 2 
4 A a 4 
1 A a 7 
2 A c 3 
5 A c 5 
6 B d 3 
9 B d 5 
7 B e 1 
8 B e 1 
11 C b 2 
12 C b 3 
10 C b 5 

Jeśli kolumna A nie jest uporządkowane (ale są pogrupowane), należy utworzyć nowy czynnik z poziomami X $ a i użyj tego.

+0

kolumnie "a" nie zamówił, ale zgrupowane. Kolejność "a" w data.frame jest ważna. – ilya

+0

oznacza, że ​​pierwsze x $ a zostanie posortowane, a następnie x $ b na podstawie x $ a, a następnie x $ c na podstawie x $ a i x $ b, czyż nie? – jazzz

0

Dziękuję Spacedman! Twoja rekomendacja działa dobrze.

x$a <- factor(x$a, levels = unique(x$a), ordered = TRUE) 
x[order(x$a,x$b, x$c),] 

następujący komentarz Gavina

x$a <- factor(x$a, levels = unique(x$a)) 
    x[order(x$a,x$b, x$c),] 
+0

obv nie powiedzie się, jeśli x $ a jest B B A A C C A A D D D - ale jeśli jest całkowicie zgrupowane, to gotowe. – Spacedman

+0

w moim zestawie danych nie było podziału na grupy. – ilya

+0

Myślę, że masz złe pojęcie o czynnikach. Zamawiający Spacedman, o którym mowa, zamawiał na poziomach. 'ordered = TRUE' produkuje ** zamówiony ** czynnik, który jest szczególnym rodzajem czynnika, w którym występuje uporządkowanie półilościowe. Tego rodzaju czynnik nie ma tu znaczenia. –

0
require(doBy) 
orderBy(~ a + b + c, data=x) 
+0

Ten zmieni kolejność kolumn a – ilya

Powiązane problemy