Tablas en R con table() y prop.table()

Manipulación de datos con R Transformación de datos
Las funciones table() y prop.table() en R

La función table puede utilizarse para resumir datos categóricos y generar tablas de frecuencia absolutas y de contigencia. En este tutorial exploraremos su sintaxis, diversos argumentos y ejemplos prácticos para ilustrar su utilidad en el análisis de datos. También exploraremos prop.table para tablas de frecuencias relativas, xtabs para tabulaciones cruzadas y addmargins para añadir márgenes a las tablas.

La función table

La función table de R se utiliza para tabular datos categóricos, contando el número de ocurrencias de cada categoría. Esta función puede crear tablas unidimensionales, que proporcionan la frecuencia de cada categoría en una única variable, y tablas bidimensionales (o superiores en matrices de alta dimensión), que muestran la distribución de frecuencias en dos o más variables.

Sintaxis de la función table

La sintaxis de la función es la siguiente:

table(..., 
      exclude = if (useNA == "no") c(NA, NaN),
      useNA = c("no", "ifany", "always"),
      dnn = list.names(...),
      deparse.level = 1)

Siendo:

  • ...: una o varias variables categóricas o expresiones que deben tabularse.
  • exclude: argumento opcional que especifica los niveles que deben excluirse de la tabla.
  • useNA: tratamiento de los valores que faltan. Las opciones posibles son "no" (por defecto), "ifany" y "always".
  • dnn: vector de caracteres que proporciona nombres para la tabla resultante.
  • deparse.level: controla cómo se construye dnn por defecto. Lee la documentación de la función para más detalles.

Tablas de frecuencias de una vía

Las tablas de una vía representan la distribución de frecuencias de una única variable. Son útiles para comprender la distribución de categorías dentro de una variable. Para crear una tabla deberás introducir un vector de caracteres, como se ilustra a continuación:

# Datos de muestra
datos <- c("B", "A", "C", "C", "A", "C", "B")

# Crea una tabla de frecuencias para una variable categórica
tabla <- table(datos)
tabla
datos
A B C 
2 2 3

La salida anterior muestra que hay dos elementos que corresponden a la categoría "A", dos que corresponden a "B" y tres a "C". La tabla anterior puede representarse mediante un gráfico de barras:

# Datos de muestra
datos <- c("B", "A", "C", "C", "A", "C", "B")

# Crear una tabla de frecuencias simple para una variable categórica
tabla <- table(datos)

# Representar la tabla
barplot(tabla, col = 2:4, ylab = "Total")

Representar una tabla de frecuencias de una vía en R

La función proporciona un argumento llamado exclude que puede utilizarse para excluir algunas categorías de la tabla de salida. En el siguiente ejemplo estamos excluyendo "B".

# Datos de muestra
datos <- c("B", "A", "C", "C", "A", "C", "B")

# Excluir niveles específicos de la tabla de frecuencias
table(datos, exclude = "B")
datos
A C 
2 3

A veces, analizar la presencia de valores perdidos es tan importante como los datos disponibles. El argumento useNA puede utilizarse para incluir valores NA en la tabla. Cuando se establece en "ifany" la tabla también contará el número de valores que faltan.

# Datos de muestra
datos <- c("B", "A", NA, NA, "A", "C", "B")

# Cuenta el número de NA si es que hay alguno
table(datos, useNA = "ifany")
datos
   A    B    C <NA> 
   2    2    1    2 

Cuando se establece en "always" la tabla mostrará el número de valores NA aunque no hubiese ninguno. Esto es muy útil para la comprobación de datos.

# Datos de muestra
datos <- c("B", "A", "A", "C", "B")

# Cuenta el número de NA aunque no haya ninguno
table(datos, useNA = "always")
datos
   A    B    C <NA> 
   2    2    1    0 

Tablas de contingencia de dos vías

Las tablas de dos vías muestran la relación entre dos variables categóricas. Son cruciales para examinar las interacciones entre variables. Este tipo de tabla también se puede crear con la función table, pero tendrás que introducir dos vectores de caracteres de la misma longitud en lugar de uno, como se ilustra a continuación.

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior")

# Creamos una tabla de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Vemos la tabla
tabla_dos_vias
        grupo_edad
genero   Junior Senior
  Hombre      2      1
  Mujer       1      1

Los datos anteriores pueden representarse con un diagrama de barras utilizando la función barplot o cualquier otra función similar:

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre", "Mujer")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior", "Senior")

# Creamos una tabla de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Representamos la tabla
barplot(tabla_dos_vias, col = 2:3, beside = TRUE, ylab = "Total")
legend("top", legend = c("Mujer", "Hombre"), fill = 2:3)

Representar una tabla de contingencia de dos vías en R

La función prop.table

La función prop.table toma una tabla creada con table y la convierte en una tabla de frecuencias relativas, también conocida como tabla de proporciones.

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior")

# Creamos una tabla de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Tabla de frecuencias relativas
prop.table(tabla_dos_vias)
        grupo_edad
genero   Junior Senior
  Female    0.2    0.2
  Male      0.4    0.2

La función incluye un argumento llamado "margin". Si se establece margin en 1, se calculan las proporciones basándose en la suma de cada fila, mientras que si se establece en 2, se calculan las proporciones basándose en la suma de cada columna.

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior")

# Crea una tabla de contingencia de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Tabla de frecuencias relativas
prop.table(tabla_dos_vias, margin = 1)
        grupo_edad
genero      Junior    Senior
  Hombre 0.6666667 0.3333333
  Mujer  0.5000000 0.5000000

La función xtabs

Una función relacionada con table es xtabs. La función xtabs permite crear tablas de contingencia y es especialmente útil para datos agrupados y cuando se trabaja con data frames. A diferencia de table, utiliza una sintaxis de fórmulas, que permite especificaciones más complejas y es ideal para el análisis estadístico.

# Data frame de muestra
df <- data.frame(x = c("G1", "G2", "G2", "G1", "G1", "G2"),
                 y = c("A", "B", "B", "C", "A", "C"))

# Tabla de contingencia con xtabs
tab <- xtabs(~ x + y, data = df)
tab
    y
x    A B C
  G1 2 0 1
  G2 0 2 1

Una característica interesante de xtabs es que puede crear tablas de contingencia ponderadas. El siguiente ejemplo ilustra cómo introducir pesos utilizando la columna w:

# Data frame de muestra
df <- data.frame(x = c("G1", "G2", "G2", "G1", "G1", "G2"),
                 y = c("A", "B", "B", "C", "A", "C"),
                 w = c(0.1, 0.2, 0.2, 0.1, 0.1, 0.3))

# Tabla de contingencia ponderada
tab <- xtabs(w ~ x + y, data = df)
tab
    y
x      A   B   C
  G1 0.2 0.0 0.1
  G2 0.0 0.4 0.3

La función addmargins

La función addmargins en R se utiliza para añadir márgenes de filas y/o columnas, que normalmente representan sumas o totales de las filas y/o columnas a tablas creadas con table o funciones similares. La sintaxis de la función es la siguiente:

addmargins(A, margin = NULL, FUN = sum, quiet = FALSE)

Siendo:

  • A: la tabla de entrada.
  • margin: el margen deseado. Por defecto, la función calcula todos los márgenes, pero cuando se establece en 1, sólo se calculan los márgenes de fila, y cuando se establece en 2, sólo se calculan los márgenes de columna.
  • FUN: función que se aplicará para calcular los márgenes. Por defecto realiza la suma.
  • quiet: lógico. Si TRUE elimina los mensajes.

Cuando la función se aplica a una tabla se añadirán por defecto ambos márgenes, contando el número de elementos por filas y columnas.

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior")

# Crea una tabla de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Agrega los márgenes
addmargins(tabla_dos_vias)
        grupo_edad
genero   Junior Senior Sum
  Hombre      2      1   3
  Mujer       1      1   2
  Sum         3      2   5

Sin embargo, si sólo quieres calcular los márgenes para las filas o para las columnas, deberás establecer el argumento margin en 1 o 2 en función de tus necesidades.

# Datos de muestra
genero <- c("Hombre", "Mujer", "Hombre", "Mujer", "Hombre")
grupo_edad <- c("Junior", "Senior", "Senior", "Junior", "Junior")

# Crea una tabla de dos vías
tabla_dos_vias <- table(genero, grupo_edad)

# Agrega los márgenes
addmargins(tabla_dos_vias, margin = 2)
        grupo_edad
genero   Junior Senior Sum
  Hombre      2      1   3
  Mujer       1      1   2

R version 4.3.2 (2023-10-31 ucrt)