3 votes

Coder la réponse à un choix multiple en R

J'ai un jeu de données CSV qui ressemble à ceci :

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

La première colonne est l'âge du participant et la deuxième colonne est une liste séparée par des virgules des réponses à choix multiple de la question 1. Dans cet exemple, le premier participant coche les cases 1, 2 et 5 et le troisième participant ne coche que la troisième case.

Maintenant, je veux évaluer les réponses à la question 1. La première étape consiste à tracer le nombre de réponses de chaque réponse possible. J'ai essayé ce qui suit :

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",
))

Supplémentaire J'ai essayé d'utiliser mChoice :

library("Hmisc")
dataset$Functions <- lapply(dataset$Functions, mChoice, label="Functions")

Mais maintenant, je ne sais pas comment gérer la liste dans le dataframe. Avez-vous une idée ?

4voto

juba Points 15701

Personnellement, je préfère d'abord transformer la variable à choix multiple en une série de variables dichotomiques, une pour chaque choix possible. Par exemple, si vous avez le cadre de données suivant :

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

Vous pouvez utiliser le code suivant :

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)

Ce qui vous donnera trois nouvelles variables :

  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

À partir de là, vous pouvez utiliser chacune de ces nouvelles variables pour des statistiques ou des tableaux croisés. Si vous souhaitez générer un tableau global des fréquences des différents choix, vous pouvez procéder ainsi :

vars <- c("var.1","var.2","var.3")
as.table(sapply(d[,vars], function(v) {
  sel <- as.numeric(v==1)
  sum(sel)
}))

Ce qui vous donnera :

var.1 var.2 var.3 
    3     3     2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X