3

次のようなCSVデータセットがあります。

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

最初の列は参加者の年齢で、2番目の列は質問1の複数の選択肢の回答のコンマ区切りリストです。この例では、最初の参加者は1番目、2番目、5番目のチェックボックスをオンにし、3番目の参加者は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")

しかし今、私はデータフレームでリストを処理する方法がわかりません。アイデアはありますか?

4

1 に答える 1

4

個人的には、最初に複数選択変数を、可能な選択肢ごとに 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)

これにより、3 つの新しい変数が得られます。

  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 
于 2013-02-08T10:40:35.977 に答える