从 R 中的多个逻辑变量创建意外事件 table
Creating a contingency table from multiple logical variables in R
我目前有一个包含一个因子和多个逻辑变量的数据框(在某种程度上对应于单个变量的各种条件,但并不相互排斥)。
做一个简单的比较,我想统计不同类型的人的车,但是一个人可以有各种各样的车。假设我还想计算他们的 phone 类型(也不排除彼此)。
虚拟数据:
data = data.frame(Profession = c("Manager", "Manager", "Developer", "Developer"), Ford = c(T, F, F, T), Renault = c(F, T, T, F), Ferrari = c(T, F, F, F), iPhone = c(T, T, T, F), Android = c(T, T, F, T))
# Profession Ford Renault Ferrari iPhone Android
# 1 Manager TRUE FALSE TRUE TRUE TRUE
# 2 Manager FALSE TRUE FALSE TRUE TRUE
# 3 Developer FALSE TRUE FALSE TRUE FALSE
# 4 Developer TRUE FALSE FALSE FALSE TRUE
我想获得一个意外事件table,其中包含汽车的数量和Phone 类型的职业。当然,我对所有 FALSE
(或 NA
)值都不感兴趣。
理想情况下,我想将其呈现在具有变量层次结构的 table 中,例如:
Manager Developer (Total)
Car
- Ford 1 1 2
- Renault 1 1 2
- Ferrari 1 0 1
Phone
- iPhone 2 1 3
- Android 2 1 3
我试过 table
,但我必须承认我很迷茫,不知道从哪里开始。
这应该有效:
# split the data by profession, result is a list with a dataframe for every profession
data2 = split(data[, -1], data$Profession)
# colSums is then equal to the frequencies per Ford, Renault, etc.
# that is binded into a dataframe for convenience
tb = data.frame(lapply(data2, colSums))
# add a column for total
tb$Total = rowSums(tb)
您也可以使用 reshape2
包执行此操作。
recast(dat, variable ~ Profession, id.var = 1, fun=sum, margins="Profession")
# variable Developer Manager (all)
# 1 Ford 1 1 2
# 2 Renault 1 1 2
# 3 Ferrari 0 1 1
# 4 iPhone 1 2 3
# 5 Android 1 2 3
recast
一步完成,但要了解变量名称为何出现在公式中,请查看
melt(dat, 1)
然后
dcast(melt(dat, 1), variable ~ Profession, value.var='value', fun=sum)
我目前有一个包含一个因子和多个逻辑变量的数据框(在某种程度上对应于单个变量的各种条件,但并不相互排斥)。
做一个简单的比较,我想统计不同类型的人的车,但是一个人可以有各种各样的车。假设我还想计算他们的 phone 类型(也不排除彼此)。
虚拟数据:
data = data.frame(Profession = c("Manager", "Manager", "Developer", "Developer"), Ford = c(T, F, F, T), Renault = c(F, T, T, F), Ferrari = c(T, F, F, F), iPhone = c(T, T, T, F), Android = c(T, T, F, T))
# Profession Ford Renault Ferrari iPhone Android
# 1 Manager TRUE FALSE TRUE TRUE TRUE
# 2 Manager FALSE TRUE FALSE TRUE TRUE
# 3 Developer FALSE TRUE FALSE TRUE FALSE
# 4 Developer TRUE FALSE FALSE FALSE TRUE
我想获得一个意外事件table,其中包含汽车的数量和Phone 类型的职业。当然,我对所有 FALSE
(或 NA
)值都不感兴趣。
理想情况下,我想将其呈现在具有变量层次结构的 table 中,例如:
Manager Developer (Total)
Car
- Ford 1 1 2
- Renault 1 1 2
- Ferrari 1 0 1
Phone
- iPhone 2 1 3
- Android 2 1 3
我试过 table
,但我必须承认我很迷茫,不知道从哪里开始。
这应该有效:
# split the data by profession, result is a list with a dataframe for every profession
data2 = split(data[, -1], data$Profession)
# colSums is then equal to the frequencies per Ford, Renault, etc.
# that is binded into a dataframe for convenience
tb = data.frame(lapply(data2, colSums))
# add a column for total
tb$Total = rowSums(tb)
您也可以使用 reshape2
包执行此操作。
recast(dat, variable ~ Profession, id.var = 1, fun=sum, margins="Profession")
# variable Developer Manager (all)
# 1 Ford 1 1 2
# 2 Renault 1 1 2
# 3 Ferrari 0 1 1
# 4 iPhone 1 2 3
# 5 Android 1 2 3
recast
一步完成,但要了解变量名称为何出现在公式中,请查看
melt(dat, 1)
然后
dcast(melt(dat, 1), variable ~ Profession, value.var='value', fun=sum)