2012-07-24 26 views
5

Estoy tratando de averiguar cómo analizar múltiples respuestas de selección/múltiple (es decir, 'seleccionar todas las que correspondan') en una encuesta que realicé recientemente.¿Cómo usar R para múltiples preguntas de selección?

SPSS tiene buenas capacidades para analizar datos de encuestas en línea y este tipo de preguntas, así que supongo que R tiene eso y más. Lidiar con estas respuestas a la encuesta es un poco complicado en Excel. Por ejemplo, muéstreme un histograma/distribución a todos los que les guste la fresa y el helado de chocolate por edad.

¿Cómo estructurar el conjunto de datos y cuáles serían los comandos para realizar algunas tabulaciones básicas de frecuencia, pareto y funciones Y OR lógicas?

+0

Para cualquiera que se encuentre con esto ahora: ahora hay un paquete dedicado para esto, MCRV: https://journal.r-project.org/archive/2014-1/koziol-bilder.pdf (comentario de @matherion) – Moritz

Respuesta

5

No he encontrado nada que sea tan conveniente como los conjuntos de respuestas múltiples en SPSS. Sin embargo, puede crear grupos de forma relativamente fácil en función de los nombres de columna comunes y, a continuación, usar cualquiera de las funciones apply() o amigos para recorrer cada grupo. He aquí un método que utiliza adply() del paquete 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 
+0

al menos en términos de salida, esto parece ser simplemente 'colSums (dat [-1])', y 'Perc' solo' Count/nrows (dat) '. ¿Hay algo más "elegante" que me falta aquí? - Genuinamente interesado porque también tengo que lidiar con este tipo de preguntas, en cuyo caso, generalmente estoy menos interesado en dividir por el número de encuestados, pero por el número de respuestas (con esta respuesta, 14, (sum (dat [-1]) ')). – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab - para una tabulación simple, probablemente tengas razón. 'table()' también te permitirá calcular pestañas cruzadas usando el mismo framework y no puedo entender fácilmente cómo se podría * adoptar fácilmente 'colSums()' para manejar ese caso, es decir, el conjunto de preguntas arriba por género. – Chase

+0

Agradable. Instalé plyr con Package Manager en OSX. Me gusta que esta solución atrape todas las respuestas prefijadas "Q4". En las respuestas, tengo "1" para desmarcado y "2" para marcado. De alguna manera, esta solución contó automáticamente 2s como comprobado a pesar de que usa 0/1. ¿Cómo lo sabe? – JHo

2

Hace poco escribí una función rápida para hacer frente a estos. Puedes modificarlo fácilmente para agregar la proporción de respuestas totales también.

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

La función:

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 
} 

Aplicar la función:

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 

Espero que esto ayude! De lo contrario, muestre algunos ejemplos del resultado deseado o describa algunas características, y veré qué se puede agregar.

actualización

Después de mirar en la salida del SPSS para esta línea, parece que lo que sigue debe hacerlo por usted. Esto es bastante fácil de envolver en una función si necesita usarla mucho.

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 
+0

Gracias por tomarse el tiempo para responder a esto. Esta solución funciona Tuve que tomar un par de pasos adicionales que fueron un buen ejercicio de aprendizaje. Subconjunto del conjunto de datos para Q4 (es decir, dat1 <- dat [c (4:15)]). Y convirtiendo mi notación nocheck (1)/check (2) en 0/1. Fue un buen ejercicio de aprendizaje para probar su solución. Gracias. – JHo

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 
} 

hace un muy buen trabajo de dar números, porcentajes en el número de casos de nivel y el porcentaje de la cantidad de nivel de respuestas. Perfecto para analizar preguntas de respuesta múltiple

Cuestiones relacionadas