2012-07-24 8 views
5

Próbuję dowiedzieć się, jak analizować wiele pytań wielokrotnego wyboru/wielu odpowiedzi (tj. "Wybierz wszystkie, które mają zastosowanie") w ankiecie, którą niedawno przeprowadziłem.Jak korzystać z R dla wielu wybranych pytań?

SPSS ma ładne możliwości analizy danych ankiet online i tego typu pytań, więc domyślam się, że R ma to i więcej. Radzenie sobie z tymi odpowiedziami ankiety jest nieco trudne w Excelu. Na przykład pokaż mi histogram/dystrybucję każdego, kto lubi truskawki i czekoladowe lody według wieku.

Jak skonstruować zestaw danych i jakie byłyby polecenia do wykonywania podstawowych tabel funkcji częstotliwości, pareto i logicznych AND OR?

+0

Dla każdego, kto ma na to ochotę: teraz jest dedykowany pakiet do tego, MCRV: https://journal.r-project.org/archive/2014-1/koziol-bilder.pdf (komentarz @matherion) – Moritz

Odpowiedz

5

Nie znalazłem niczego, co jest tak wygodne, jak zestawy wielokrotnych odpowiedzi w SPSS. Można jednak tworzyć grupy stosunkowo łatwo na podstawie wspólnych nazw kolumn, a następnie użyć dowolnej z funkcji lub znajomych do iteracji w każdej grupie. Oto jeden sposób korzystania adply() z pakietu 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

przynajmniej pod względem danych wyjściowych, wydaje się, że jest to po prostu 'colSums (dat [-1])', i 'Perc' po prostu' Count/nrows (dat) '. Czy jest tu coś bardziej "wymyślnego", czego mi tu brakuje? - Naprawdę interesuje mnie to, że ja również mam do czynienia z takimi typami pytań, w którym to przypadku zazwyczaj jestem mniej zainteresowany dzieleniem przez liczbę respondentów, ale przez liczbę odpowiedzi (z tą odpowiedzią, 14, (' sum (dat [-1]) ')). – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab - dla prostej tabeli prawdopodobnie masz rację. 'table()' z łatwością pozwoli ci obliczyć krzyżowe zakładki, ale używając tego samego szkieletu i nie mogę z łatwością objąć głowy jak łatwo * adoptować 'colSums()' do obsługi tego przypadku, tzn. zestaw pytań powyżej według płci. – Chase

+0

Nice. Zainstalowałem plyr z Menedżerem pakietów w OSX. Podoba mi się, że to rozwiązanie zdobędzie wszystkie odpowiedzi z prefiksem "Q4". W odpowiedziach mam "1" dla niezaznaczonych i "2" dla sprawdzonych. W jakiś sposób to rozwiązanie automatycznie policzyło 2s, mimo że używasz 0/1. Jak to wie? – JHo

2

Niedawno napisałem funkcję szybkiego radzenia sobie z nimi. Możesz go łatwo modyfikować, aby dodać część całkowitych odpowiedzi.

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

Funkcja:

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 
} 

Zastosuj funkcję:

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 

nadzieję, że to pomaga! W przeciwnym razie pokaż przykłady pożądanych wyników lub opisz niektóre funkcje, a ja zobaczę, co można dodać.

Aktualizacja

Po patrząc na wyjściu SPSS dla tej gry online, wydaje się następujące powinien zrobić to za Ciebie. Jest to dość łatwe do zawinięcia w funkcję, jeśli potrzebujesz jej bardzo dużo.

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

Dziękuję za poświęcenie czasu, aby odpowiedzieć na to pytanie. To rozwiązanie działa. Musiałem zrobić kilka dodatkowych kroków, które były dobrym ćwiczeniem. Podział zbioru danych na czwarty kwartał (tj. Dat1 <- dat [c (4:15)]). I konwertowanie notatek nocheck (1)/check (2) na 0/1. To było dobre ćwiczenie edukacyjne, aby wypróbować swoje rozwiązanie. Dziękuję Ci. – 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 
} 

robi bardzo dobrą robotę daje liczby, procenty na liczby i odsetka przypadków poziomie na poziomie liczby odpowiedzi. Idealny do analizowania pytań z wieloma odpowiedziami

Powiązane problemy