1

给定一个数据框,

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

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

就像在多行上使用tapply,aggregateave(x,y,mean)函数一样,同时创建一个新的变量/列。不幸的是,我事先不知道虚拟变量的数量。我唯一知道的是虚拟变量从第 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)

4

2 回答 2

3

这里有一些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))
于 2015-02-19T16:08:50.800 回答
2

您可以尝试summarise_eachmutate_eachdplyr

library(dplyr)
df %>% 
    group_by(ID) %>% 
    summarise_each(funs(mean), starts_with('dummy'))
于 2015-02-19T16:03:38.100 回答