首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多选题中使用R?

如何在多选题中使用R?
EN

Stack Overflow用户
提问于 2012-07-24 08:51:54
回答 3查看 6.7K关注 0票数 6

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

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

我如何构造数据集,以及执行频率、pareto和逻辑与或函数的一些基本表格的命令是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-24 09:30:58

我还没有找到像SPSS中的多响应集一样方便的东西。但是,您可以基于公共列名相对容易地创建组,然后使用任何apply()函数或朋友遍历每个组。以下是使用plyr包中的adply()的一种方法:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2012-07-24 11:14:39

我最近写了一个快速函数来处理这些问题。您可以很容易地修改它,以添加总响应的比例。

代码语言:javascript
复制
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))

函数:

代码语言:javascript
复制
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
}

应用函数:

代码语言:javascript
复制
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的输出后,看起来下面的代码应该可以为您完成此任务。如果您需要经常使用函数,则可以轻松地将其封装到一个函数中。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2015-08-21 10:47:16

代码语言:javascript
复制
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
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11622660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档