Dado un marco de datos,

ID <- c("a","b","b","c","c","c","d","d","d")
dummy1 <- c(1,0,1,1,0,0,1,1,0)
dummy2 <- c(0,0,0,0,1,1,1,1,1)
dummy3 <- c(1,0,0,1,1,0,0,1,1)
df <- data.frame(ID,dummy1,dummy2,dummy3)

  ID dummy1 dummy2 dummy3
1  a      1      0      1
2  b      0      0      0
3  b      1      0      0
4  c      1      0      1
5  c      0      1      1
6  c      0      1      0
7  d      1      1      0
8  d      1      1      1
9  d      0      1      1

Quiero calcular la media de cada variable en un conjunto de múltiples variables ficticias.

Sería como usar tapply, aggregate o una función ave(x,y,mean) en varias filas, creando una nueva variable / columna al mismo tiempo. Desafortunadamente, no conozco el número de variables ficticias de antemano. Lo único que sé es que las variables ficticias comienzan en la columna 2. Mi resultado se vería así:

ID     m_dummy1  m_dummy2  m_dummy3   m_dummy5...
a      1         0         1
b      0         0         0
c      0.33      0.66      0.66
d      0.66      1         0.66

O así:

ID     m_dummy1  m_dummy2  m_dummy3   m_dummy5...
a ...  1         0         1
b ...  0         0         0
b ...  0         0         0    
c ...  0.33      0.66      0.66
c ...  0.33      0.66      0.66
c ...  0.33      0.66      0.66
d ...  0.66      1         0.66    
d ...  0.66      1         0.66
d ...  0.66      1         0.66

En mi escenario, tengo un número desconocido de dummies de 1 a x, por lo que podría tener solo dummy2, pero tal vez tenga "dummy1" y los dummies ficticios "dummy5" y "dummy6". La solución perfecta me permitiría crear columnas "m_dummy" para todas las columnas después de la columna 2. Por lo tanto, también funcionaría si faltara el dummy3 o si hubiera un dummy4 adicional dummy4 <- c(1,0,0,0,0,0,0,1,0)

1
rmuc8 19 feb. 2015 a las 19:02

2 respuestas

La mejor respuesta

Puede probar summarise_each o mutate_each de dplyr

library(dplyr)
df %>% 
    group_by(ID) %>% 
    summarise_each(funs(mean), starts_with('dummy'))
2
akrun 19 feb. 2015 a las 16:03

Aquí hay un par de enfoques data.table que facilitan la realización de cualquiera de sus alternativas:

library(data.table)

as.data.table(df)[, lapply(.SD, mean), by = ID]
#    ID    dummy1    dummy2    dummy3
# 1:  a 1.0000000 0.0000000 1.0000000
# 2:  b 0.5000000 0.0000000 0.0000000
# 3:  c 0.3333333 0.6666667 0.6666667
# 4:  d 0.6666667 1.0000000 0.6666667

as.data.table(df)[, names(df)[-1] := lapply(.SD, mean), by = ID][]
#    ID    dummy1    dummy2    dummy3
# 1:  a 1.0000000 0.0000000 1.0000000
# 2:  b 0.5000000 0.0000000 0.0000000
# 3:  b 0.5000000 0.0000000 0.0000000
# 4:  c 0.3333333 0.6666667 0.6666667
# 5:  c 0.3333333 0.6666667 0.6666667
# 6:  c 0.3333333 0.6666667 0.6666667
# 7:  d 0.6666667 1.0000000 0.6666667
# 8:  d 0.6666667 1.0000000 0.6666667
# 9:  d 0.6666667 1.0000000 0.6666667

Los equivalentes de base R de lo anterior serían:

aggregate(. ~ ID, df, mean)

Y

df[-1] <- lapply(df[-1], function(x) ave(x, df[[1]], FUN = mean))
3
A5C1D2H2I1M1N2O1R2T1 19 feb. 2015 a las 16:08