2010-03-19 14 views
7

In SPSS, è (relativamente) facile creare una tabella incrociata con più variabili utilizzando i fattori (oi valori) come intestazione della tabella. Quindi, qualcosa come il seguente (dati inventati, ecc.). Q1, Q2 e Q3 hanno ciascuno un 1, un 2 o un 3 per ogni persona. Li ho appena lasciati come numeri, ma potrebbero essere fattori, nessuno dei due sembrava aiutare a risolvere il problema.Campi incrociati con più elementi

 
         1 (very Often) 2 (Rarely) 3 (Never) 
    Q1. Likes it   12    15    13 
    Q2. Recommends it  22    11    10 
    Q3. Used it   22    12    9 

In SPSS, è persino possibile richiedere riga, colonna o percentuali totali.

Ho provato table(), ftable(), xtab(), CrossTable() da gmodels e CrossTable() da descr e nessuno di questi può gestire (afaik) più variabili; per lo più sembrano gestire 1 variabile incrociata con un'altra variabile, e la 3 ° crea livelli.

C'è un pacchetto con alcuni esempi di tabella/tabella incrociati che potrei usare per capirlo? Sono sicuro che mi manca qualcosa di semplice, quindi apprezzo che tu abbia sottolineato ciò che mi mancava. Forse devo generare ogni riga come una lista separata e quindi creare un dataframe e stampare il dataframe?

AGGIORNAMENTO: ora ho scoperto ctab() nel pacchetto catspec, che è anche sulla strada giusta. È interessante notare che R non ha equivalenti coerenti con CTAbles in SPSS, che è fondamentalmente uno strumento "tabulatori" ai vecchi strumenti tabulati utilizzati per la ricerca di sondaggi. ctab() sta provando, ed è un primo passo ammirevole ... ma non è ancora possibile creare questa tabella (sopra) con essa.

risposta

7

Il pacchetto Hmisc ha la funzione summary.formula che può fare qualcosa lungo le linee desiderate. E 'molto flessibile, in modo da guardare la pagina di aiuto per gli esempi, ma qui è un'applicazione per il vostro problema:

library(Hmisc) 
dd <- data.frame(Q1=sample(1:3, 20, replace=T), Q2=sample(1:3, 20, replace=T), 
       Q3=sample(1:3, 20, replace=T)) #fake data 
summary(~Q1+Q2+Q3, data=dd, fun=table) 

Questo dà il seguente risultato:

Descriptive Statistics (N=20) 

+------+-------+ 
|  |  | 
+------+-------+ 
|Q1 : 1|25% (5)| 
+------+-------+ 
| 2 |45% (9)| 
+------+-------+ 
| 3 |30% (6)| 
+------+-------+ 
|Q2 : 1|30% (6)| 
+------+-------+ 
| 2 |35% (7)| 
+------+-------+ 
| 3 |35% (7)| 
+------+-------+ 
|Q3 : 1|35% (7)| 
+------+-------+ 
| 2 |30% (6)| 
+------+-------+ 
| 3 |35% (7)| 
+------+-------+ 

I possibili valori sono dati in righe , perché ha la flessibilità di diversi gruppi di valori per diverse variabili. Potresti essere in grado di giocare con i parametri della funzione (come method e fun) per ottenere l'altra direzione.

+0

Questa è una funzione potente; l'unico problema è la mancanza di controllo sull'output. –

0

è possibile utilizzare una funzione personalizzata da usare rbind() su più tavoli, qualcosa di simile:

multitab <- function(...){ 
    tabs<-list(...) 
    tablist<-lapply(tabs,table) 
    bigtab<-t(sapply(tablist,rbind)) 
    bigtab } 
+0

Vero, ma l'output lascia a desiderare. x <-c (1,3,1,3,1,3,1,3,4,4); y <-c (2,4,1,4,2,4,1,4,2 , 4); z <-c (3,5,2,5,3,5,2,5,3,5) multitab (x, y, z) [, 1] [, 2] [, 3] [1 ,] 4 4 2 [2,] 2 3 5 [3,] 2 3 5 Ma è un buon inizio ... –

6

modifica di un precedente esempio

library(Hmisc) 
library(plyr) 
dd <- data.frame(q1=sample(1:3, 20, replace=T), 
q2=sample(1:3, 20, replace=T), 
q3=sample(1:3, 20, replace=T)) #fake data 

cross <- ldply(describe(dd), function(x) x$values[1,])[-1] 

rownames(cross) <- c("Q1. Likes it","Q2. Recommends it","Q3. Used it") 
names(cross) <- c("1 (very Often)","2 (Rarely)","3 (Never)") 

sguardi incrociati Ora come questo

> cross 
        1 (very Often) 2 (Rarely) 3 (Never) 
Q1. Likes it     4   10   6 
Q2. Recommends it    7   9   4 
Q3. Used it     6   4  10 
+0

Questo dovrebbe essere contrassegnato come la risposta corretta –

0

xtabs ha un'interfaccia formula che può richiedere un po 'di pratica per abituarsi, ma questo può essere fatto.Se si hanno i dati in un dataframe df e le variabili siete chiamati ques e resp, è possibile utilizzare:

xtabs(~ques+resp,data=df) 

Ad esempio:

> t1 <- rep(c("A","B","C"),5) 
> t2 <- rpois(15,4) 
> df <- data.frame(ques=t1,resp=t2) 
> xtabs(~ques+resp,data=df) 
    resp 
names 2 3 4 5 6 7 9 
    A 1 0 2 1 0 0 1 
    B 1 0 0 2 1 1 0 
    C 1 2 0 1 0 1 0 
1

Il problema di fondo è che questi dati non è in tidy format . Il crosstabbing di più variabili sarà più semplice quando i dati vengono ridisegnati in forma "lunga". Possiamo farlo con gather dal pacchetto tidyr.

Dopo la riformulazione, molte funzioni della tabella incrociata funzioneranno; Userò crosstab dal pacchetto janitor (poiché - la divulgazione completa - mantengo quel pacchetto e ho creato la funzione per questo scopo).

# Create reproducible sample data 
set.seed(1) 
possible_values <- c("1 (Very Often)", "2 (Rarely)", "3 (Never)") 
some_values <- sample(possible_values, 100, replace = TRUE) 
dat <- data.frame(Q1 = some_values[1:25], Q2 = some_values[26:50], 
       Q3 = some_values[51:75], Q4 = some_values[76:100]) 

library(tidyr) 
library(janitor) 

dat %>% 
    gather(question, response) %>% 
    crosstab(question, response) 
#> question 1 (Very Often) 2 (Rarely) 3 (Never) 
#> 1  Q1    8   8   9 
#> 2  Q2    4   11  10 
#> 3  Q3    8   12   5 
#> 4  Q4    7   7  11 

Da lì, è possibile formattare come percentuali, ecc, con janitor::adorn_crosstab().

Problemi correlati