对多个虚拟变量执行操作
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
我想计算一组多个虚拟变量中每个变量的平均值。
这就像在多行上使用 tapply
、aggregate
或 ave(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_each
或 mutate_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))
给定一个数据框,
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)
函数,同时创建一个新的 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_each
或 mutate_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))