我有一个如下所示的CSV数据集:
Age;Functions;...
12;1,2,5;...
45;1,4,5,8;...
23;3;...
第一列是参与者的年龄,第二列是逗号分隔的问题1的多项选择答案列表。在此示例中,第一个参与者检查第1个,第2个和第5个复选框以及第3个参与者仅检查第三个复选框。
现在,我想评估问题1的答案。第一步是绘制每个可能答案的答案数。我尝试了以下内容:
dataset$Functions <- strsplit(as.character(dataset$Functions), ",", fixed=T)
dataset$Functions <- lapply(dataset$Functions, factor, levels = 0:8, labels=c(
"no answer",
"checkbox 1",
"checkbox 2",
"checkbox 3",
"checkbox 4",
"checkbox 5",
"checkbox 6",
"checkbox 7",
"checkbox 8",
))
另外我试过用户mChoice:
library("Hmisc")
dataset$Functions <- lapply(dataset$Functions, mChoice, label="Functions")
但是现在,我不知道如何处理数据框中的列表。你有什么想法吗?
答案 0 :(得分:3)
Personaly我更喜欢先将多选变量转换为一系列二分变量,每个变量都有一个变量。例如,如果您有以下数据框:
d <- data.frame(age=c(25,35,45,55,65),var=c("1,2,3","1,2","3","2","1"))
age var
1 25 1,2,3
2 35 1,2
3 45 3
4 55 2
5 65 1
您可以使用以下代码:
lev <- levels(factor(d$var))
lev <- unique(unlist(strsplit(lev, ",")))
mnames <- gsub(" ", "_", paste("var", lev, sep = "."))
result <- matrix(data = "0", nrow = length(d$var), ncol = length(lev))
char.var <- as.character(d$var)
for (i in 1:length(lev)) {
result[grep(lev[i], char.var, fixed = TRUE), i] <- "1"
}
result <- data.frame(result, stringsAsFactors = TRUE)
colnames(result) <- mnames
d <- cbind(d,result)
这将为您提供三个新变量:
age var var.1 var.2 var.3
1 25 1,2,3 1 1 1
2 35 1,2 1 1 0
3 45 3 0 0 1
4 55 2 0 1 0
5 65 1 1 0 0
从这里,您可以使用这些新变量中的每一个进行统计或交叉制表。如果要生成不同选项频率的全局表,可以执行以下操作:
vars <- c("var.1","var.2","var.3")
as.table(sapply(d[,vars], function(v) {
sel <- as.numeric(v==1)
sum(sel)
}))
哪个会给你:
var.1 var.2 var.3
3 3 2