2012-12-04 3 views
8

Ho un set di dati con risposte a un oggetto Likert su una scala 9pt. Vorrei creare una tabella di frequenza (e un barattolo) dei dati ma alcuni valori sulla scala non si verificano mai nel mio set di dati, quindi table() rimuove tale valore dalla tabella delle frequenze. Vorrei invece presentare il valore con una frequenza di 0. Cioè, dato il seguente insieme di datiInclude frequenze zero nella tabella delle frequenze per i dati Likert

# Assume a 5pt Likert scale for ease of example 
data <- c(1, 1, 2, 1, 4, 4, 5) 

desidero ottenere la seguente tabella di frequenza senza dover inserire manualmente una colonna denominata 3 con il valore 0.

1 2 3 4 5 
3 1 0 2 1 

Sono nuovo di R, quindi forse ho trascurato qualcosa di essenziale, ma non ho incontrato una funzione o opzione che dà il risultato desiderato.

risposta

5

table produce una tabella di contingenza, mentre tabular produce una frequenza tabella che include zero conteggi.

tabulate(data) 
# [1] 3 1 0 2 1 

Un altro modo (se si dispone di numeri interi a partire dal 1 - ma facilmente modificabile per altri casi):

setNames(tabulate(data), 1:max(data)) # to make the output easier to read 
# 1 2 3 4 5 
# 3 1 0 2 1 
+0

Bene. Grazie, ma tabulate non è il modo universale per produrre tabelle di frequenza. Funziona su numeri interi positivi. prova, ad es. 'tabulate (0: 1)' o 'tabulate (-50000: 1)' (indovina perché l'output è identico se gli argomenti sono molto diversi). Tabulate funziona sul tuo caso speciale (ti capita di avere una scala "Likert" a partire da 1, e su fattori (perché i livelli sono codificati, per convenzione, come interi consecutivi positivi a partire da 1). Non funzionerà su vettori di caratteri o con zero e valori negativi – lebatsnok

+0

... quindi, mentre mi piace accettare la mia risposta, direi che l'altra risposta è più universale. Convertire la conversione in fattore X e quindi creare una tabella di contingenza unidimensionale con 'table' funziona con tutti i tipi di dati mentre 'tabulate' funziona solo con alcuni casi speciali – lebatsnok

+0

In effetti, questo non funziona se i dati di frequenza 0 corrispondono al massimo. Ad esempio, nell'esempio sopra, se non ci fosse 5 in 'data',' tabulate' non lo mostrerebbe neanche. – AugSB

17

EDIT:

tabular produce tabelle di frequenza mentre table produce tabelle di contingenza. Tuttavia, per ottenere frequenze zero in una tabella di contingenza unidimensionale come nell'esempio precedente, il codice seguente funziona ancora, ovviamente.


This question fornito il collegamento mancante. Convertendo l'elemento Likert a un fattore, e specificando esplicitamente i livelli, livelli con una frequenza di 0 sono ancora contato

data <- factor(data, levels = c(1:5)) 
table(data) 

produce l'uscita desiderata

0

Se si desidera calcolare velocemente i conteggi o percentuali per le voci multiple Likert e ottenere la vostra l'output in un data.frame, potrebbe piacere la funzione psych::response.frequencies nel pacchetto psych.

Creiamo alcuni dati (da notare che non ci sono 9s):

df <- data.frame(item1 = sample(1:7, 2000, replace = TRUE), 
       item2 = sample(1:7, 2000, replace = TRUE), 
       item3 = sample(1:7, 2000, replace = TRUE)) 

Se si desidera calcolare il proporzione in ogni categoria

psych::response.frequencies(df, max = 1000, uniqueitems = 1:9) 

si ottiene la seguente:

  1  2  3  4  5  6  7 8 9 miss 
item1 0.1450 0.1435 0.139 0.1325 0.1380 0.1605 0.1415 0 0 0 
item2 0.1535 0.1315 0.126 0.1505 0.1535 0.1400 0.1450 0 0 0 
item3 0.1320 0.1505 0.132 0.1465 0.1425 0.1535 0.1430 0 0 0 

Se si desidera contare, è possibile moltiplicare per e dimensione del campione:

psych::response.frequencies(df, max = 1000, uniqueitems = 1:9) * nrow(df) 

si ottiene il seguente:

 1 2 3 4 5 6 7 8 9 miss 
item1 290 287 278 265 276 321 283 0 0 0 
item2 307 263 252 301 307 280 290 0 0 0 
item3 264 301 264 293 285 307 286 0 0 0 

Un paio di note:

  • il default max è 10. Quindi, se avete più di 10 opzioni di risposta, avrai problemi. Altrimenti, nel tuo caso, e molti casi di articoli Likert, potresti omettere l'argomento max.
  • uniqueitems specifica i valori possibili. Se tutti i tuoi valori erano presenti in almeno un elemento, questo sarebbe dedotto dai dati.
  • Penso che la funzione funzioni solo con dati numerici. Quindi, se hai le tue categorie likert codificate "Fortemente in disaccordo", ecc. Non funzionerà.