Tengo una tabla cuyo encabezado se parece a esto (he simplificado):

id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10

donde cada fila, excepto para la identificación, es una variable categórica. Pongamos nombre a las categorías a, B, C, D, E.

Me gustaría crear una tabla de contingencia para algunos de las columnas, de la siguiente manera (por razones de brevedad, no la he puesto de ejemplo los números en las celdas). Obtener el total de la columna/fila sería genial, pero no es obligatorio, puedo calcular que a mí más tarde.

      a1  a2  a3  a4 Total
    ----------------------
    A|
    B|
    C|
    D|
    E|
Total|

Por lo tanto, la pregunta es cómo crear una tabla de referencias cruzadas, basado en múltiples columnas en R? Los ejemplos que he visto con tabla() y xtabs() se utiliza una columna única. En mi caso, las columnas adyacentes, de modo que una tabla de referencias cruzadas sería un resumen de las columnas a1..a4, otro a5..a7 y así sucesivamente. Espero que haya una manera elegante de hacer esto.

Yo soy un programador, pero un novato en R.

Gracias de antemano.

OriginalEl autor wishihadabettername | 2010-08-19

2 Comentarios

  1. 7

    Sus datos está mal formateado para este propósito. Aquí es una manera de abordar adecuadamente la remodelación de los datos con el reshape paquete.

    library(reshape)
    data.m <- melt(data, id = "id")

    Para calcular una tabla para todos los niveles, con los márgenes, usted podría utilizar

    cast(data.m, value ~ variable, margins = T)

    Para un subconjunto, tomar la correspondiente subconjunto de data.m.

    OriginalEl autor JoFrhwld

  2. 3

    Aquí está cómo hacerlo usando la base de comandos de R. Usted no necesita la for bucle si cada columna tiene el mismo factor de niveles, pero el bucle sería una buena prueba de fallos.

    > set.seed(21)
    > df <- data.frame(
    +   id=1:20,
    +   a1=sample(letters[1:4],20,TRUE),
    +   a2=sample(letters[1:5],20,TRUE),
    +   a3=sample(letters[2:5],20,TRUE),
    +   a4=sample(letters[1:5],20,TRUE),
    +   a5=sample(letters[1:5],20,TRUE),
    +   a6=sample(letters[1:5],20,TRUE) )
    > 
    > for(i in 2:NCOL(df)) {
    +   levels(df[,i]) <- list(a="a",b="b",c="c",d="d",e="e")
    + }
    > 
    > addmargins(mapply(table,df[,-1]))
        a1 a2 a3 a4 a5 a6 Sum
    a    6  2  0  2  5  3  18
    b    3  3  7  2  1  3  19
    c    5  3  1  6  5  3  23
    d    6  8  6  1  5  3  29
    e    0  4  6  9  4  8  31
    Sum 20 20 20 20 20 20 120

    OriginalEl autor Joshua Ulrich

Dejar respuesta

Please enter your comment!
Please enter your name here