2011-04-30 21 views
6

¿Alguien sabe una forma pulida para ordenar los resultados que salen de una operación ddply resumir?R plyr - Ordenar los resultados de DDPLY?

Esto es lo que estoy haciendo para obtener la salida ordenó al descender profundidad.

ddims <- ddply(diamonds, .(color), summarise, depth = mean(depth), table = mean(table)) 
    ddims <- ddims[order(-ddims$depth),] 

Con salida ...

> ddims 
    color depth table 
7  J 61.88722 57.81239 
6  I 61.84639 57.57728 
5  H 61.83685 57.51781 
4  G 61.75711 57.28863 
1  D 61.69813 57.40459 
3  F 61.69458 57.43354 
2  E 61.66209 57.49120 

No muy feo, pero estoy esperando una manera lo hacen muy bien dentro de ddply(). Alguien sabe como?

libro ggplot2 de Hadley tiene este ejemplo para ddply y subconjunto, pero no es en realidad la salida de clasificación, simplemente seleccionando las dos diamantes más pequeños por grupo.

ddply(diamonds, .(color), subset, order(carat) <= 2) 
+2

mirada a la función de organizar – hadley

+0

No estoy seguro de que hay algo que puede hacer "sobre la marcha" -, pero sólo una nota al azar, en lugar de 'ddims [Orden (-ddims $ profundidad),]' , puede probar 'ddims [orden (ddims $ profundidad, decreciente = VERDADERO),]'. De esta forma, no es necesario crear un nuevo objeto vectorial "negativo". –

Respuesta

7

voy a utilizar esta ocasión para anunciar un bit para data.table, que es más rápido para correr y (en mi percepción) al menos tan elegante para escribir:

library(data.table) 
ddims <- data.table(diamonds) 
system.time(ddims <- ddims[, list(depth=mean(depth), table=mean(table)), by=color][order(depth)]) 

    user system elapsed 
    0.003 0.000 0.004 

Por el contrario, sin necesidad de ordenar , su código ddply ya tiene 30 veces más:

user system elapsed 
0.106 0.010 0.119 

Con todo el respeto que tengo por el excelente trabajo de Hadley, por ejemplo, en ggplot2 y genialidad en general, debo confesar que para mí, data.table sustituir en su totalidad ddply - por razones de velocidad.

+0

Gracias amigo. No estaba al tanto del paquete 'data.table'. Se ve muy rápido y eso es bastante legible también. Voy a jugar con algunos grandes conjuntos de datos en el futuro cercano, así que gracias por eso. Voy a esperar para ver si alguien responde con una respuesta específica 'ddply'. Esto suena –

3

Sí, para clasificar puede anidar el ddply en otro ddply. He aquí cómo se utilizaría ddply para ordenar una columna, por ejemplo, su columna table:

ddimsSortedTable <- ddply(ddply(diamonds, .(color), 
    summarise, depth = mean(depth), table = mean(table)), .(table)) 

    color depth table 
1  G 61.75711 57.28863 
2  D 61.69813 57.40459 
3  F 61.69458 57.43354 
4  E 61.66209 57.49120 
5  H 61.83685 57.51781 
6  I 61.84639 57.57728 
7  J 61.88722 57.81239 
+0

Soo unlogic y no se ven bien. En general, esto significa mal código. ¿Es este realmente el camino a seguir? – CousinCocaine

+0

¿Por qué no agrega su propia respuesta y muestra un método mejor? – Ben

+0

Me sale tu comentario, y mi publicación suena más negativa de lo que esperaba. Vine aquí porque esta también era mi pregunta. Lo resolví guardando mi dataframe como 'df' y luego hice' df [order (df $ column,] '. Así que primero lo guardo en un dataframe y luego lo ordeno. – CousinCocaine

1

Un poco tarde a la fiesta, pero las cosas pueden ser un poco diferente con dplyr. El préstamo de solución de Crayola para data.table:

dat1 <- microbenchmark(
dtbl<- data.table(diamonds)[, list(depth=mean(depth), table=mean(table)), by=color][order(- depth)], 
dplyr_dtbl <- arrange(summarise(group_by(tbl_dt(diamonds),color), depth = mean(depth) , table = mean(table)),-depth), 
dplyr_dtfr <- arrange(summarise(group_by(tbl_df(diamonds),color), depth = mean(depth) , table = mean(table)),-depth), 
times = 20, 
unit = "ms" 
) 

Los resultados muestran que dplyr con tbl_dt es un poco más lento que el enfoque data.table. Sin embargo, dplyr con hoja.de.datos es más rápido:

  expr  min  lq median  uq  max neval 
     data.table 9.606571 10.968881 11.958644 12.675205 14.334525 20 
dplyr_data.table 13.553307 15.721261 17.494500 19.544840 79.771768 20 
dplyr_data.frame 4.643799 5.148327 5.887468 6.537321 7.043286 20 

Nota: He cambiado los nombres, obviamente, por lo que los resultados son más legibles microbenchmark

3

Si está utilizando dplyr, recomendaría aprovechando la %.% operador, que lee a un código más intuitivo.

data(diamonds, package = 'ggplot2') 
library(dplyr) 
diamonds %.% 
    group_by(color) %.% 
    summarise(
    depth = mean(depth), 
    table = mean(table) 
) %.% 
    arrange(desc(depth)) 
+0

¿Por qué son la mayoría de las respuestas a las preguntas de R? ¿magia negra? Explique dónde está documentado el operador%.% y lo que hace. No es algo que pueda encontrar fácilmente con Google. – reinierpost

+1

'help ("%.% ", package = 'dplyr')' – Ramnath

+0

Eso ayuda , ¡gracias! – reinierpost

Cuestiones relacionadas