2010-03-19 14 views
7

En SPSS, es (relativamente) fácil crear una tabla cruzada con múltiples variables utilizando los factores (o valores) como encabezado de la tabla. Entonces, algo como lo siguiente (datos inventados, etc.). Q1, Q2 y Q3 tienen cada uno un 1, un 2 o un 3 por cada persona. Simplemente los dejé como números, pero podrían ser factores, ninguno parecía ayudar a resolver el problema.Tabla de referencias cruzadas con elementos múltiples

 
         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 

En SPSS, uno puede incluso solicitar porcentajes de fila, columna o total.

He intentado table(), ftable(), xtab(), CrossTable() desde gmodels, y CrossTable() desde descr, y ninguno de estos puede manejar (afaik) múltiples variables; en su mayoría parecen manejar una variable cruzada con otra variable, y la tercera crea capas.

¿Hay algún paquete con buenos ejemplos de tabulaciones cruzadas/tablas que pueda usar para resolver esto? Estoy seguro de que me falta algo simple, así que te agradezco que me hayas señalado lo que me perdí. Tal vez tengo que generar cada fila como una lista separada y luego crear un marco de datos e imprimir el marco de datos.

ACTUALIZACIÓN: He descubierto ctab() en el paquete catspec, que también está en el camino correcto. Es interesante que R no tenga un equivalente consistente a Ctables en SPSS, que es básicamente una herramienta de "tabulación", al igual que las antiguas herramientas de tabulación utilizadas para la investigación de encuestas. ctab() lo intenta, y es un primer paso admirable ... pero todavía no puedes hacer esta tabla (arriba) con él.

Respuesta

7

El paquete Hmisc tiene la función summary.formula que puede hacer algo en la línea que desee. Es muy flexible, a fin de buscar en la página de ayuda de ejemplos, pero aquí es una aplicación para su 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) 

Esto da el siguiente resultado:

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

Los posibles valores se dan en filas , porque tiene la flexibilidad de diferentes conjuntos de valores para diferentes variables. Es posible que pueda jugar con los parámetros de la función (como method y fun) para obtener la otra dirección.

+0

Esta es una función poderosa; el único problema es la falta de control sobre la producción. –

0

se puede utilizar una función personalizada para utilizar rbind() en varias mesas, algo como esto:

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

Es cierto, pero el resultado deja algo que desear. 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 Pero es un buen comienzo ... –

6

Modificación de un ejemplo anterior

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

miradas Ahora transversales como éste

> 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

Esto debe marcarse como la respuesta correcta –

0

xtabs tiene una interfaz fórmula que puede tomar un poco de práctica para acostumbrarse a, pero esto se puede hacer.Si usted tiene los datos de una trama de datos df y sus variables son llamadas ques y resp, puede utilizar:

xtabs(~ques+resp,data=df) 

Por ejemplo:

> 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

El problema subyacente es que estos datos no se encuentra en tidy format . La tabulación cruzada de múltiples variables será más fácil cuando los datos se vuelvan a formar en forma "larga". Podemos hacer eso con gather del paquete tidyr.

Después de la remodelación, funcionarán muchas funciones de tabla cruzada; Usaré crosstab del paquete de conserje (ya que - divulgación completa - Mantengo ese paquete y construí la función para este fin).

# 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 

A partir de ahí, puede dar formato como porcentajes, etc., con janitor::adorn_crosstab().

Cuestiones relacionadas