8 Stimmen

Analyse von mehreren Antworten

df1 <-
  data.frame(c("männlich", "weiblich", "männlich"),
             c("1", "2", "3", "4", "5", "6"),
             seq(141, 170))

names(df1) = c("geschlecht", "alter", "größe")

df1$alter <- factor(
  df1$alter,
  levels = c(1, 2, 3, 4, 5, 6),
  labels = c("16-24", "25-34", "35-44", "45-54", "55-64", "65+")
)

q1a = c(1, 0, 1, 0, 0, 1)
q1b = c(0, 0, 2, 2, 2, 0)
q1c = c(0, 0, 3, 3, 0, 3)
# 1,2 and 3 used to be compatible with existing datasets. 
# Could change all to 1 if necessary.

df2 <- data.frame(q1a = q1a, q1b = q1b, q1c = q1c)
df1 <- cbind(df1, df2)

rm(q1a, q1b, q1c, df2)

Ich versuche die Analyse von Mehrfachantwortenfragen aus SPSS in R zu replizieren.

Derzeit verwende ich diesen Code:

#Funktion erstellen zur Analyse von Fragen mit gruppierten Daten
multfreqtable <- function(a, b, c) {
  # Anzahl der Befragten (für Prozent der Fälle)
  totrep = sum(a == 1 | b == 2 | c == 3)

  #Frequenztabelle erstellen
  table_a = data.frame("a", sum(a == 1))
  names(table_a) = c("frage", "freq")
  table_b = data.frame("b", sum(b == 2))
  names(table_b) = c("frage", "freq")
  table_c = data.frame("c", sum(c == 3))
  names(table_c) = c("frage", "freq")
  table_question <- rbind(table_a, table_b, table_c)

  #Einzelne Frage-Tabellen entfernen
  rm(table_a, table_b, table_c)

  #Gesamtsumme hinzufügen
  total = as.data.frame("Gesamt")
  totalsum = (sum(table_question$freq, na.rm = TRUE))
  totalrow = cbind(total, totalsum)
  names(totalrow) = c("frage", "freq")
  table_question = rbind(table_question, totalrow)

  #Prozent-Spalte zur Frequenztabelle hinzufügen
  percentcalc = as.numeric(table_question$freq)
  percent = (percentcalc / totalsum) * 100
  table_question <- cbind(table_question, percent)

  #Prozent der Fälle-Spalte zur Frequenztabelle hinzufügen
  poccalc = as.numeric(table_question$freq)
  percentofcases = (poccalc / totrep) * 100
  table_question <- cbind(table_question, percentofcases)

  #Prozent der Fälle Wert ausdrucken
  total_respondents <<- data.frame(totrep)

  #Alle unnötigen Daten und Werte entfernen
  rm(
    total,
    totalsum,
    totalrow,
    b,
    c,
    percent,
    percentcalc,
    percentofcases,
    totrep,
    poccalc
  )

  return(table_question)
}

#Funktion aufrufen - muss an data.frame mit $ gebunden sein !!!
q1_frequency <- multfreqtable(df1$q1a, df1$q1b, df1$q1c)

#Prozent der Fälle umbenennen - Dies ist sehr wichtig bei Verwendung der aktuellen Methode
total_respondents_q1 <- total_respondents
rm(total_respondents)

Ergebnis: Diese Tabelle wird produziert:

Ausgabetabelle

Ich suche nach einer effizienteren Methode, die idealerweise keine Änderung der Funktion erfordert, wenn es mehr oder weniger Multiple-Choice-Fragen gibt.

12voto

A5C1D2H2I1M1N2O1R2T1 Punkte 184056

Ihre Funktion ist tatsächlich viel zu kompliziert für das, was Sie tun müssen. Ich denke, eine Funktion wie diese sollte funktionieren und flexibler sein.

multfreqtable = function(data, question.prefix) {
  # Finden Sie die Spalten mit den Fragen
  a = grep(question.prefix, names(data))
  # Finden Sie die Gesamtzahl der Antworten
  b = sum(data[, a] != 0)
  # Finden Sie die Summen für jede Frage
  d = colSums(data[, a] != 0)
  # Finden Sie die Anzahl der Befragten
  e = sum(rowSums(data[,a]) !=0)
  # d + b als Vektor. Dies ist Ihre Gesamtfrequenz
  f = as.numeric(c(d, b))
  data.frame(question = c(names(d), "Total"),
             freq = f,
             percent = (f/b)*100,
             percentofcases = (f/e)*100 )
}

Fügen Sie Ihrem Beispiel-Datensatz eine weitere Frage hinzu:

set.seed(1); df1$q2a = sample(c(0, 1), 30, replace=T)
set.seed(2); df1$q2b = sample(c(0, 2), 30, replace=T)
set.seed(3); df1$q2c = sample(c(0, 3), 30, replace=T)

Erstellen Sie eine Tabelle für die "q1"-Antworten:

> multfreqtable(df1, "q1")
  question freq   percent percentofcases
1      q1a   15  33.33333             60
2      q1b   15  33.33333             60
3      q1c   15  33.33333             60
4    Total   45 100.00000            180

Erstellen Sie eine Tabelle für die "q2"-Antworten:

> multfreqtable(df1, "q2")
  question freq   percent percentofcases
1      q2a   14  31.11111       53.84615
2      q2b   13  28.88889       50.00000
3      q2c   18  40.00000       69.23077
4    Total   45 100.00000      173.07692

Tabellen für mehrere Fragen

Hier ist eine modifizierte Version der Funktion, die es Ihnen ermöglicht, eine Liste von Tabellen für mehrere Fragen auf einmal zu erstellen:

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 = (f/b)*100,
                           percentofcases = (f/e)*100 )
    names(temp)[i] = question.prefix[i]
  }
  temp
}

Beispiele:

> multfreqtable(df1, "q1")
$q1
  question freq   percent percentofcases
1        a   15  33.33333             60
2        b   15  33.33333             60
3        c   15  33.33333             60
4    Total   45 100.00000            180

> test1 = multfreqtable(df1, c("q1", "q2"))
> test1
$q1
  question freq   percent percentofcases
1        a   15  33.33333             60
2        b   15  33.33333             60
3        c   15  33.33333             60
4    Total   45 100.00000            180

$q2
  question freq   percent percentofcases
1        a   14  31.11111       53.84615
2        b   13  28.88889       50.00000
3        c   18  40.00000       69.23077
4    Total   45 100.00000      173.07692

> test1$q1
  question freq   percent percentofcases
1        a   15  33.33333             60
2        b   15  33.33333             60
3        c   15  33.33333             60
4    Total   45 100.00000            180

0voto

Evgeny Punkte 1

Ich habe bemerkt, dass dieser Beitrag ziemlich alt ist, aber ich konnte keine aktuellere Lösung finden. Hier ist meine Version basierend auf dem dplyr/tidyverse-Ansatz.

mult_resp = function(df1, mv_q = c("q1a", "q1b", "q1c")){

  df2 = df1 %>%
    mutate(id = rownames(.)) %>%  #Zeilen-ID zur Zählung von n_Fällen
    select(id, everything()) %>% 
    mutate_at(mv_q, ~ ifelse(. != 0, 1, 0)) %>%
    gather(question, resp,-id, -gender,-age,-height) 

  #Anzahl der Fälle ohne "alles null" Fälle zählen
  n_cases = df2 %>% group_by(id) %>%
    summarise(n = sum(resp)) %>% 
    summarise(sum(n > 0))

  #Ausgabetabelle
  res = df2 %>% 
    group_by(question) %>%
    summarise(freq = sum(resp)) %>%
    mutate(
      percent = freq/sum(freq) *100,
      percent_of_cases = freq/as.numeric(n_cases)*100
      ) %>% 
    rbind(., 
          data.frame(question ="Total", 
                     freq =sum(.$freq, na.rm=TRUE),
                     percent =sum(.$percent, na.rm=TRUE),
                     percent_of_cases = sum(.$percent_of_cases, na.rm=TRUE)
                     )
          )
    res
}

Beispiel:

> mult_resp(df1, mv_q = c("q1a", "q1b", "q1c"))
# A tibble: 4 x 4
  question  freq percent percent_of_cases

1 q1a         15    33.3               60
2 q1b         15    33.3               60
3 q1c         15    33.3               60
4 Total       45   100.               180

0voto

Es ist eine alte Frage. Du kannst jedoch das Paket userfriendlyscience verwenden, um sehr einfach multiple Response-Umfragedaten zu analysieren.

library(userfriendlyscience)
multiResponse (data, c('v1', 'v2', 'v3'))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X