2010-11-03 15 views
5

tengo una trama de datos con 900.000 filas y 11 columnas en R. Los nombres de columna y tipos son los siguientes:datos Ordenar en I

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 

Quiero ordenar los datos por esas variables en el siguiente orden :

  1. fecha
  2. MCODE
  3. ycode
  4. yissue

El orden de los niveles es importante aquí, es decir, deben ordenarse por fecha primero, y si hay fechas idénticas, deben ordenarse por mcode, etc. ¿Cómo puedo hacer eso en R?

+2

leer el primer párrafo de'ayuda (clasificación) 'responde su pregunta. –

+1

Después de obtener las respuestas a continuación, estoy seguro de que he hecho lo correcto. I ♥ Stack Overflow. –

Respuesta

10

Tal vez algo como esto?

> 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 

La función "ordenar" puede tomar varios vectores como argumentos.

+5

también puede prefijar un argumento para ordenar con a - para ordenar ascendente en lugar de descender solo para ese criterio, por ejemplo, orden (df $ b, -df $ a, df $ c). – caracal

+0

nice, great adendum – jbremnant

8

sobre la base de la solución anterior, aquí hay otros dos enfoques. el segundo enfoque requiere plyr.

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

si ninguna de las respuestas anteriores se enciende el fuego siempre se puede utilizar la función orderBy() del paquete Doby:

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

Como se puede intuitivamente esperar, se puede poner un signo negativo delante de cualquier variable para ordenarla descendiendo

No hay nada mágico sobre orderBy(). Como lo indica la documentación, se trata de un "contenedor para la función order() - la diferencia importante es que las variables para ordenar pueden estar dadas por una fórmula modelo".

puedo encontrar la sintaxis más fácil de recordar.

1

Notas adicionales: utilizar -c() para neutralizar los factores de tipo de caracteres o columnas

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

también usted puede añadir un vector para recoger sólo ciertas columnas

with(df, df[order(a, b, c), c('a','b','x','y')])