2013-02-08 126 views
3

我有一个CSV数据集,看起来像这样:编码选择题答案中的R

Age;Functions;... 
12;1,2,5;... 
45;1,4,5,8;... 
23;3;... 

的第一列是参与者和第二列的年龄是选择题答案的一个逗号分隔的列表问题1.在这个例子中,第一个参与者检查第一,第二和第五个复选框,第三个参与者只检查第三个复选框。

现在,我想评估问题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") 

但现在,我不知道如何来处理数据框列表。你有好主意吗?

回答

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 
+0

感谢。而已。 – Cornelius