对多个虚拟变量执行操作

Perform operations on multiple dummy variables

给定一个数据框,

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

我想计算一组多个虚拟变量中每个变量的平均值。

这就像在多行上使用 tapplyaggregateave(x,y,mean) 函数,同时创建一个新的 variable/column。不幸的是,我事先不知道虚拟变量的数量。我唯一知道的是虚拟变量从第 2 列开始。我的结果如下所示:

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

或者像这样:

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

在我的场景中,我有从 1 到 x 的未知数量的假人,所以我可能只有 dummy2,但也许我有 "dummy1" 和虚构的假人 "dummy5" 和 "dummy6". 完美的解决方案将允许我为第 2 列之后的所有列创建 "m_dummy" 列。 因此,如果缺少 dummy3 或有一个额外的 dummy4 dummy4 <- c(1,0,0,0,0,0,0,1,0)

,它也会起作用

您可以尝试 summarise_eachmutate_each 来自 dplyr

library(dplyr)
df %>% 
    group_by(ID) %>% 
    summarise_each(funs(mean), starts_with('dummy'))

这里有一些 data.table 方法可以让您轻松地执行任一备选方案:

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

上面的基础 R 等价物是:

aggregate(. ~ ID, df, mean)

df[-1] <- lapply(df[-1], function(x) ave(x, df[[1]], FUN = mean))