2010-11-12 16 views
7

Diciamo che ho un data.frameCome ordinare il dataframe in R con la conservazione dell'ordine delle colonne specificata?

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 

Vorrei ordinare x da B e C colonne, ma mantenere l'ordine di una come prima. x[order(x$b, x$c),] - interrompe l'ordine della colonna a. Questo è quello che voglio:

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 

C'è un modo rapido per farlo?

Attualmente eseguo il ciclo "for" e ordina ogni sottoinsieme, sono sicuro che ci deve essere un modo migliore.

Grazie! Ilya

risposta

7

Se colonna "a" è ordinato già, allora la sua questa semplice:

> 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 

Se la colonna A non è ordinata (ma è raggruppato), creare un nuovo fattore con i livelli di $ x a e usa quello.

+0

colonna "a" non ordinato, ma raggruppati. L'ordine di "a" in data.frame è importante. – ilya

+0

significa che prima x $ a verrà ordinato x $ b in base a x $ a, e quindi x $ c in base a x $ ae x $ b, non è vero? – jazzz

0

Grazie Spacedman! La tua raccomandazione funziona bene.

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

seguente commento di Gavin

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

obv che fallisce se x $ a è B B A A C C A A D D D - ma se è completamente raggruppato allora hai finito. – Spacedman

+0

nel mio set di dati non ci potrebbe essere separazione nei gruppi. – ilya

+0

Penso che tu abbia avuto un'idea sbagliata dei fattori. L'ordinamento Spacedman a cui si riferiva stava ordinando nei livelli. 'ordered = TRUE' produce un fattore ** ordinato **, che è un tipo speciale di fattore in cui vi è un ordinamento semi-quantitativo. Questo tipo di fattore è irrilevante per il problema qui. –

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

Questo cambierà l'ordine della colonna a – ilya

Problemi correlati