2011-09-13 9 views
6

Podría alguien indicar cómo podemos aplicar múltiples funciones a la misma columna utilizando tapply (o cualquier otro método, plyr, etc.) para que el resultado se pueda obtener en distintas columnas). Por ejemplo., Si tengo una trama de datos conAplicar múltiples funciones a la columna utilizando positivamente

User MoneySpent 
Joe  20 
Ron  10 
Joe  30 
... 

que desee obtener el resultado como suma de MoneySpent + número de ocurrencias.

que utiliza una función como -

f <- function(x) c(sum(x), length(x)) 
tapply(df$MoneySpent, df$Uer, f) 

Pero esto no se divide en columnas, da algo como por ejemplo,

Joe Joe 100, 5 # The sum=100, number of occurrences = 5, but it gets juxtaposed 

Gracias de antemano,

  • Raj .

Respuesta

8

Por supuesto que puede hacer cosas como esta usando ddply del paquete plyr:

dat <- data.frame(x = rep(letters[1:3],3),y = 1:9) 

ddply(dat,.(x),summarise,total = NROW(piece), count = sum(y)) 
    x total count 
1 a  3 12 
2 b  3 15 
3 c  3 18 

Puede mantener una lista más funciones de resumen, más allá de sólo dos, si lo desea. Tenga en cuenta que estoy siendo un poco complicado aquí al llamar al NROW en una variable interna en ddply llamada piece. Podrías haber hecho algo como length(y) en su lugar. (Y probablemente debería, haciendo referencia a la variable interna piece no se garantiza que funcione en versiones futuras, creo Haz lo que digo, no lo que hago y sólo tiene que utilizar length()..)

+0

¡Excelente solución! Gracias – xbsd

+0

¿Conoces algún recurso donde pueda leer más sobre plyr? El pdf en CRAN tiene información muy limitada sobre el uso. – xbsd

+0

@xbsd: podría decirse que una de las fuentes más completas de información estará en SO, ya sea bajo la etiqueta 'plyr' o simplemente buscando' plyr' con la etiqueta R: http://stackoverflow.com/search?q= [ r] + plyr – Chase

4

ddply() es conceptualmente el más claro, pero a veces en su lugar, es útil usar tapply por razones de velocidad, en cuyo caso funciona lo siguiente:

do.call(rbind, tapply(df$MoneySpent, df$User, f)) 
Cuestiones relacionadas