7

我试图弄清楚如何在我最近进行的一项调查中分析多项选择/多项回答(即“选择所有适用的”)问题。

SPSS 有很好的分析在线调查数据和这些类型问题的能力,所以我猜 R 有这个和更多。在 Excel 中处理这些调查答案有点棘手。例如,按年龄向我展示每个喜欢草莓和巧克力冰淇淋的人的直方图/分布。

如何构建数据集以及执行频率、帕累托和逻辑 AND OR 函数的一些基本表格的命令是什么?

4

3 回答 3

8

我还没有发现任何像 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
于 2012-07-24T01:30:58.380 回答
4

我最近写了一个快速函数来处理这些。您也可以轻松修改它以添加总响应的比例。

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
于 2012-07-24T03:14:38.907 回答
2
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
}

在为您提供数字、案例数量级别的百分比和回复数量级别的百分比方面做得非常好。非常适合分析多响应问题

于 2015-08-21T02:47:16.077 回答