【问题标题】:Encode multiple choice answer in R在R中编码多项选择答案
【发布时间】:2013-02-08 10:12:12
【问题描述】:

我有一个如下所示的 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")

但是现在,我不知道如何处理数据框中的列表。你有什么想法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我个人更喜欢首先将多项选择变量转换为一系列二分变量,每个变量对应一个可能的选择。例如,如果您有以下数据框:

    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 
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多