2011-05-19 10 views
11

Quiero calcular mean (o cualquier otro resumen estadístico de una longitud de, por ejemplo, min, max, length, sum) de una variable numérica ("valor") dentro de cada nivel de una variable de agrupación ("grupo").media Calcular grupo (u otras estadísticas de resumen) y asignan a los datos originales

El resumen estadístico debe ser asignado a una nueva variable que tiene la misma longitud como los datos originales . Es decir, cada fila de los datos originales debe tener un valor correspondiente al valor del grupo actual; el conjunto de datos debe no colapsarse en una fila por grupo. Por ejemplo, considere grupo mean:

Antes

id group value 
1 a  10 
2 a  20 
3 b  100 
4 b  200 

Después

id group value grp.mean.values 
1 a  10  15 
2 a  20  15 
3 b  100 150 
4 b  200 150 

Respuesta

7

Una opción es utilizar plyr. ddply espera data.frame (la primera d) y devuelve data.frame (la segunda d). Otras funciones XXply funcionan de manera similar; es decir, ldply espera un list y devuelve un data.frame, dlply hace lo contrario ... y así sucesivamente. El segundo argumento es la (s) variable (s) de agrupamiento. El tercer argumento es la función que queremos calcular para cada grupo.

require(plyr) 
ddply(dat, "group", transform, grp.mean.values = mean(value)) 

    id group value grp.mean.values 
1 1  a 10    15 
2 2  a 20    15 
3 3  b 100    150 
4 4  b 200    150 
2

Aquí hay otra opción utilizando funciones de base aggregate y merge:

merge(x, aggregate(value ~ group, data = x, mean), 
    by = "group", suffixes = c("", "mean")) 

    group id value.x value.y 
1  a 1  10  15 
2  a 2  20  15 
3  b 3  100  150 
4  b 4  200  150 

Usted puede obtener los nombres de columna "mejor" con suffixes:

merge(x, aggregate(value ~ group, data = x, mean), 
    by = "group", suffixes = c("", ".mean")) 


    group id value value.mean 
1  a 1 10   15 
2  a 2 20   15 
3  b 3 100  150 
4  b 4 200  150 
12

Tenga una mirada en la función ave . Algo así como

df$grp.mean.values <- ave(df$value, df$group) 

Si desea utilizar ave para calcular algo más por grupo, es necesario especificar FUN = your-desired-function, por ejemplo, FUN = min:

df$grp.min <- ave(df$value, df$group, FUN = min) 
6

También puede hacer esto en dplyr:

library(dplyr) 
df %>% 
    group_by(group) %>% 
    mutate(grp.mean.values = mean(value)) 

... o data.table:

library(data.table) 
setDT(df)[ , grp.mean.values := mean(value), by = group] 
Cuestiones relacionadas