¿Cómo encontrar estadísticas de resumen para todas las combinaciones únicas de factores en un marco de datos en R? [cerrado]

11

Quiero calcular un resumen de una variable en un data.frame para cada combinación única de factores en el data.frame. ¿Debo usar plyr para hacer esto? Estoy de acuerdo con el uso de bucles en lugar de aplicar (); así que solo descubrir cada combinación única sería suficiente.

russellpierce
fuente
1
La pregunta es engañosa cuando pregunta sobre combinaciones únicas de factores y luego, en detalles, pregunta sobre el resumen por combinaciones únicas.
Wojtek

Respuestas:

7

Si bien creo que aggregatees probablemente la solución que está buscando, si desea crear una lista explícita de todas las combinaciones posibles de factores, expand.gridlo hará por usted. p.ej

> expand.grid(height = seq(60, 80, 5), weight = seq(100, 300, 50),
             sex = c("Male","Female"))
       height weight    sex
1      60    100   Male
2      65    100   Male
... 
30     80    100 Female
31     60    150 Female

Luego, puede recorrer cada fila en el marco de datos resultante para extraer registros de sus datos originales.

Mark M. Fredrickson
fuente
11

Ver aggregatey by. Por ejemplo, del archivo de ayuda para aggregate:

## Compute the averages according to region and the occurrence of more
## than 130 days of frost.
aggregate(state.x77,
      list(Region = state.region,
           Cold = state.x77[,"Frost"] > 130),
      mean)
Aniko
fuente
1
respuesta correcta más rápida
John
3

Aquí está la solución plyr, que tiene la ventaja de devolver múltiples estadísticas de resumen y producir una barra de progreso para cálculos largos:

library(ez) #for a data set
data(ANT)
cell_stats = ddply(
    .data = ANT #use the ANT data
    , .variables = .(cue,flanker) #uses each combination of cue and flanker
    , .fun = function(x){ #apply this function to each combin. of cue & flanker
        to_return = data.frame(
            , acc = mean(x$acc)
            , mrt = mean(x$rt[x$acc==1])
        )
        return(to_return)
    }
    , .progress = 'text'
)
Mike Lawrence
fuente
¡Gracias! Esto funcionó, aunque tuve que colocar una coma en la llamada a data.frame. stats = ddply (.data = ords, .variables =. (Symbol, SysID, Hour), .fun = function (x) {to_return = data.frame (s = sum (x Profit) ) return (to_return)}, .progress = 'text')Profit),m=mean(x
1

Además de otras sugerencias, puede encontrar útil la describe.by()función en el psychpaquete. Se puede usar para mostrar estadísticas de resumen sobre variables numéricas en los niveles de una variable de factor.

Jeromy Anglim
fuente
1

Personalmente me gusta cast(), desde el paquete de remodelación debido a su simplicidad:

library(reshape)
cast(melt(tips), sex ~ smoker | variable, c(sd,mean, length))
Brandon Bertelsen
fuente
1

En library(doBy)allí también está la summaryBy()función, por ejemplo

summaryBy(DV1 + DV2 ~ Height+Weight+Sex,data=my.data)
russellpierce
fuente