7

最近行った調査で、複数の選択/複数の回答(つまり、「該当するものをすべて選択」)の質問を分析する方法を見つけようとしています。

SPSSには、オンライン調査データやこれらのタイプの質問を分析するための優れた機能があるので、Rにはそれ以上のものがあると思います。これらの調査の回答を処理することは、Excelでは少し注意が必要です。たとえば、イチゴとチョコレートのアイスクリームが好きな人全員の年齢別のヒストグラム/分布を見せてください。

データセットを構造化するにはどうすればよいですか。また、頻度、パレート、論理積OR関数の基本的な表を実行するためのコマンドは何でしょうか。

4

3 に答える 3

8

SPSSの複数の応答セットほど便利なものは見つかりませんでした。ただし、一般的な列名に基づいて比較的簡単にグループを作成し、apply()関数またはフレンドを使用して各グループを反復処理できます。パッケージadply()から使用する1つのアプローチは次のとおりです。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 に答える