给定数据框,
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
,aggregate
或ave(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)
答案 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_each
或dplyr
library(dplyr)
df %>%
group_by(ID) %>%
summarise_each(funs(mean), starts_with('dummy'))