2010-03-19 15 views
7

In SPSS ist es (relativ) einfach, eine Kreuztabelle mit mehreren Variablen zu erstellen, wobei die Faktoren (oder Werte) als Tabellenüberschrift verwendet werden. Also, etwas wie das Folgende (erfundene Daten, etc.). Q1, Q2 und Q3 haben für jede Person entweder eine 1, eine 2 oder eine 3. Ich habe sie einfach als Zahlen zurückgelassen, aber sie könnten Faktoren sein, und keiner schien das Problem zu lösen.Kreuztabelle mit mehreren Elementen

 
         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 kann man sogar Zeilen-, Spalten- oder Gesamtprozentsätze anfordern.

Ich habe versucht, table(), ftable(), xtab(), CrossTable() von gmodels und CrossTable() von descr, und keiner von diesen kann (afaik) mehrere Variablen behandeln; Sie scheinen meist mit einer Variablen zu arbeiten, die mit einer anderen Variablen gekreuzt ist, und die dritte erzeugt Ebenen.

Gibt es ein Paket mit einigen guten Beispielen für Kreuztabellen/Tabellen, mit denen ich das herausfinden könnte? Ich bin mir sicher, dass ich etwas Einfaches verpasse, deshalb weiß ich es zu schätzen, dass Sie darauf hingewiesen haben, was ich vermisst habe. Vielleicht muss ich jede Zeile als separate Liste generieren und dann einen Datenrahmen erstellen und den Datenrahmen drucken?

UPDATE: Ich habe jetzt ctab() im Paket Catspec entdeckt, das auch auf dem richtigen Weg ist. Es ist interessant, dass R keine konsistente Entsprechung zu Ctables in SPSS hat, was im Grunde genommen ein "Tabbing" -Tool ist, ähnlich den alten Tabulatortools, die für Umfrageforschung verwendet werden. ctab() versucht es und ist ein bewundernswerter 1. Schritt ... aber Sie können diesen Tisch (oben) immer noch nicht damit machen.

Antwort

7

Das Hmisc Paket hat die summary.formula Funktion, die etwas in der von Ihnen gewünschten Weise tun kann. Es ist sehr flexibel, so sehen Sie die Hilfeseite für Beispiele, aber hier ist eine Anwendung, um Ihr Problem:

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) 

Dies ergibt folgendes Ergebnis:

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

die möglichen Werte in Zeilen angegeben , weil es die Flexibilität verschiedener Werte für verschiedene Variablen hat. Sie können möglicherweise mit den Funktionsparametern (wie method und fun) spielen, um die andere Richtung zu erhalten.

+0

Dies ist eine leistungsstarke Funktion; Das einzige Problem ist die fehlende Kontrolle über die Ausgabe. –

0

Sie können eine benutzerdefinierte Funktion verwenden rbind() auf mehrere Tabellen zu verwenden, etwa so:

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

Stimmt, aber die Ausgabe lässt etwas zu wünschen übrig. 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 Aber es ist ein guter Anfang ... –

6

Modifizieren eines vorherigen Beispiel

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

Jetzt Kreuz sieht wie folgt aus

> 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

Dies sollte als die richtige Antwort markiert werden –

0

xtabs hat eine Formel-Schnittstelle, die ein wenig Übung kann sich daran zu gewöhnen, aber dies getan werden kann.Wenn Sie die Daten in einem Datenrahmen df und Ihre Variablen sind ques und resp genannt, können Sie verwenden:

xtabs(~ques+resp,data=df) 

Zum Beispiel:

> 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

Das zugrunde liegende Problem ist, dass diese Daten nicht in tidy format . Das Kreuztabellen mehrerer Variablen wird einfacher, wenn die Daten in eine "lange" Form umgeformt werden. Das können wir mit gather aus dem tidyr-Paket machen.

Nach dem Umformen funktionieren viele Kreuztabellenfunktionen; Ich werde crosstab aus dem Hausmeister-Paket verwenden (seit - vollständige Offenlegung - Ich behalte dieses Paket und baute die Funktion für diesen Zweck).

# 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 

Von dort können Sie als Prozentsatz formatieren usw. mit janitor::adorn_crosstab().

Verwandte Themen