2010-11-12 15 views
7

Digamos que tengo un hoja.de.datos¿Cómo ordenar el dataframe en R con la preservación de orden de columna especificada?

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 

quisiera ordenar x por las columnas B y C, pero manteniendo el orden de como antes. x[order(x$b, x$c),] - cancela el orden de la columna a. Esto es lo que quiero:

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 

¿Hay una manera rápida de hacerlo?

Actualmente corro el bucle "for" y ordeno cada subconjunto, estoy seguro de que debe haber una manera mejor.

¡Gracias! Ilya

Respuesta

7

Si la columna "a" se ordena ya, entonces su esta sencilla:

> 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 

la columna A no se ordena (pero está agrupada), cree un nuevo factor con los niveles de $ x a y usa eso.

+0

"a" no ordenado, pero agrupados. El orden de "a" en data.frame es importante. – ilya

+0

significa que primero x $ a se ordenará luego x $ b basado en x $ a, y luego x $ c basado en x $ a y x $ b, ¿no? – jazzz

0

Gracias Spacedman! Tu recomendación funciona bien.

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

siguiente comentario de Gavin columna

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

obv que falla si x $ a es B B B A A C C A A D D D - pero si está completamente agrupado, listo. – Spacedman

+0

en mi conjunto de datos no podría haber separación en grupos. – ilya

+0

Creo que tiene una idea equivocada sobre los factores. El pedido al que se refiere Spacedman fue ordenar en los niveles. 'ordered = TRUE' produce un factor ** ordered **, que es un tipo especial de factor donde hay un orden semicuantitativo. Este tipo de factor es irrelevante para el problema aquí. –

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

Éste cambiará el orden de la columna a – ilya

Cuestiones relacionadas