¿Cómo puedo aplicar diferentes funciones agregadas a diferentes columnas en R?

¿Cómo puedo aplicar diferentes funciones agregadas a diferentes columnas en R? El aggregate() función solo ofrece un argumento de función para pasar:

V1  V2        V3
1   18.45022  62.24411694
2   90.34637  20.86505214
1   50.77358  27.30074987
2   52.95872  30.26189013
1   61.36935  26.90993530
2   49.31730  70.60387016
1   43.64142  87.64433517
2   36.19730  83.47232907
1   91.51753  0.03056485
... ...       ...

> aggregate(sample,by=sample["V1"],FUN=sum)
  V1 V1       V2       V3
1  1 10 578.5299 489.5307
2  2 20 575.2294 527.2222

¿Cómo puedo aplicar un una experiencia diferente función a cada columna, es decir, agregar V2 con mean() función y V2 con sum() función, sin llamar aggregate() ¿varias veces?

preguntado el 22 de mayo de 12 a las 14:05

@mdsumner, por supuesto, también se agradece cualquier otra función con cualquier otro nombre hermoso:

3 Respuestas

Para esa tarea, usaré ddply in plyr

> library(plyr)
> ddply(sample, .(V1), summarize, V2 = sum(V2), V3 = mean(V3))
  V1       V2       V3
1  1 578.5299 48.95307
2  2 575.2294 52.72222

contestado el 22 de mayo de 12 a las 14:05

Me gusta mucho la simplicidad de plyr. Comencé a usarlo después de conocer este paquete aquí en stackoverflow. - Alex

¡Qué lindo! ¿Cuál es la magia con el argumento "resumir" aquí? EDITAR: entendí eso, esa es la función real aplicada con argumentos adicionales pasados ​​más adelante. - bárbaro

...O la función data.table en el paquete del mismo nombre:

library(data.table)

myDT <- data.table(sample) # As mdsumner suggested, this is not a great name

myDT[, list(sumV2 = sum(V2), meanV3 = mean(V3)), by = V1]

#      V1    sumV2   meanV3
# [1,]  1 578.5299 48.95307
# [2,]  2 575.2294 52.72222

contestado el 22 de mayo de 12 a las 14:05

Llamemos al marco de datos x más bien que sample que ya está tomado.

EDIT:

La by La función proporciona una ruta más directa que dividir/aplicar/combinar

by(x, list(x$V1), f)

:EDITAR

lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)

Por supuesto, esa no es una función separada para cada columna, pero uno puede hacer ambos trabajos.

myfunkyfunctionthatdoesadifferentthingforeachcolumn = function(x) c(sum(x$V2), mean(x$V3))

Son posibles formas convenientes de recopilar el resultado como esta (pero consulte el paquete plyr para obtener una solución integral, considere esta motivación para aprender algo mejor).

 matrix(unlist(lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)), ncol = 2, byrow = TRUE, dimnames = list(unique(x$V1), c("sum", "mean")))

contestado el 22 de mayo de 12 a las 22:05

¡Bueno saber! Sin embargo, prefiero sortear ese trabajo adicional de implementar la función intermedia, por lo tanto, el paquete que sugirió Kohske hace exactamente lo que estaba buscando :) - bárbaro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.