对多个虚拟变量执行操作

时间:2015-02-19 16:02:17

标签: r dummy-data

给定数据框,

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)函数一样,同时创建一个新的变量/列。不幸的是,我事先并不知道虚拟变量的数量。我唯一知道的是虚拟变量从第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的未知数量的假人,所以我可能只有假2,但也许我有&#34; dummy1&#34;还有虚构的假人&#34; dummy5&#34;和&#34; dummy6&#34;。 完美的解决方案将允许我创建&#34; m_dummy&#34;第2列之后所有列的列。 因此,如果dummy3丢失或者有一个额外的dummy4 dummy4 <- c(1,0,0,0,0,0,0,1,0)

,它也会起作用

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

您可以尝试summarise_each

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