我试图弄清楚如何在我最近进行的一项调查中分析多项选择/多项回答(即“选择所有适用的”)问题。
SPSS 有很好的分析在线调查数据和这些类型问题的能力,所以我猜 R 有这个和更多。在 Excel 中处理这些调查答案有点棘手。例如,按年龄向我展示每个喜欢草莓和巧克力冰淇淋的人的直方图/分布。
如何构建数据集以及执行频率、帕累托和逻辑 AND OR 函数的一些基本表格的命令是什么?
我试图弄清楚如何在我最近进行的一项调查中分析多项选择/多项回答(即“选择所有适用的”)问题。
SPSS 有很好的分析在线调查数据和这些类型问题的能力,所以我猜 R 有这个和更多。在 Excel 中处理这些调查答案有点棘手。例如,按年龄向我展示每个喜欢草莓和巧克力冰淇淋的人的直方图/分布。
如何构建数据集以及执行频率、帕累托和逻辑 AND OR 函数的一些基本表格的命令是什么?
我还没有发现任何像 SPSS 中的多重响应集一样方便的东西。但是,您可以根据常见的列名相对轻松地创建组,然后使用任何apply()
函数或朋友来遍历每个组。adply()
这是从plyr
包中使用的一种方法:
library(plyr)
set.seed(1)
#Fake data with three "like" questions. 0 = non selected, 1 = selected
dat <- data.frame(resp = 1:10,
like1 = sample(0:1, 10, TRUE),
like2 = sample(0:1, 10, TRUE),
like3 = sample(0:1, 10, TRUE)
)
adply(dat[grepl("like", colnames(dat))], 2, function(x)
data.frame(Count = as.data.frame(table(x))[2,2],
Perc = as.data.frame(prop.table(table(x)))[2,2]))
#-----
X1 Count Perc
1 like1 6 0.6
2 like2 5 0.5
3 like3 3 0.3
我最近写了一个快速函数来处理这些。您也可以轻松修改它以添加总响应的比例。
set.seed(1)
dat <- data.frame(resp = 1:10,
like1 = sample(0:1, 10, TRUE),
like2 = sample(0:1, 10, TRUE),
like3 = sample(0:1, 10, TRUE))
功能:
multi.freq.table = function(data, sep="", dropzero=FALSE, clean=TRUE) {
# Takes boolean multiple-response data and tabulates it according
# to the possible combinations of each variable.
#
# See: http://stackoverflow.com/q/11348391/1270695
counts = data.frame(table(data))
N = ncol(counts)
counts$Combn = apply(counts[-N] == 1, 1,
function(x) paste(names(counts[-N])[x],
collapse=sep))
if (isTRUE(dropzero)) {
counts = counts[counts$Freq != 0, ]
} else if (!isTRUE(dropzero)) {
counts = counts
}
if (isTRUE(clean)) {
counts = data.frame(Combn = counts$Combn, Freq = counts$Freq)
}
counts
}
应用功能:
multi.freq.table(dat[-1], sep="-")
# Combn Freq
# 1 1
# 2 like1 2
# 3 like2 2
# 4 like1-like2 2
# 5 like3 1
# 6 like1-like3 1
# 7 like2-like3 0
# 8 like1-like2-like3 1
希望这可以帮助!否则,显示一些所需输出的示例或描述一些功能,我会看看可以添加什么。
在在线查看 SPSS 的输出后,似乎以下内容应该为您完成。如果您需要大量使用它,这很容易包装到一个函数中。
data.frame(Freq = colSums(dat[-1]),
Pct.of.Resp = (colSums(dat[-1])/sum(dat[-1]))*100,
Pct.of.Cases = (colSums(dat[-1])/nrow(dat[-1]))*100)
# Freq Pct.of.Resp Pct.of.Cases
# like1 6 42.85714 60
# like2 5 35.71429 50
# like3 3 21.42857 30
multfreqtable(data_set, "Banner")
multfreqtable = function(data, question.prefix) {
z = length(question.prefix)
temp = vector("list", z)
for (i in 1:z) {
a = grep(question.prefix[i], names(data))
b = sum(data[, a] != 0)
d = colSums(data[, a] != 0)
e = sum(rowSums(data[,a]) !=0)
f = as.numeric(c(d, b))
temp[[i]] = data.frame(question = c(sub(question.prefix[i],
"", names(d)), "Total"),
freq = f,
percent_response = (f/b)*100,
percent_cases = (f/e)*100 )
names(temp)[i] = question.prefix[i]
}
temp
}
在为您提供数字、案例数量级别的百分比和回复数量级别的百分比方面做得非常好。非常适合分析多响应问题