La función table() en R: contar y hacer tablas de frecuencias

table() cuenta cuántas veces aparece cada valor. Es la función que usas para explorar variables categóricas y, probablemente, la más rentable de R en relación esfuerzo-resultado.

Ejemplo simple

colores <- c("rojo", "azul", "rojo", "verde", "rojo", "azul")

table(colores)

Te devuelve el recuento de cada uno. Con una columna de un data frame es igual:

table(iris$Species)

Cruzar dos variables

Pásale dos vectores y obtienes una tabla de doble entrada:

encuesta <- data.frame(
  ciudad = c("Madrid", "Madrid", "Bilbao", "Bilbao", "Madrid", "Bilbao"),
  transporte = c("metro", "coche", "coche", "bus", "metro", "coche")
)

table(encuesta$ciudad, encuesta$transporte)

En dos segundos ves la relación entre ciudad y medio de transporte. Esto en Excel sería una tabla dinámica.

Porcentajes en vez de recuentos

prop.table() convierte la tabla en proporciones:

recuento <- table(encuesta$ciudad, encuesta$transporte)

prop.table(recuento)              # sobre el total
prop.table(recuento, margin = 1)  # porcentaje por filas
prop.table(recuento, margin = 2)  # porcentaje por columnas

El margin es lo mismo que en apply(): 1 son filas, 2 columnas.

Para verlo en porcentaje con menos decimales:

round(prop.table(recuento, margin = 1) * 100, 1)

Ejemplo algo más completo

Un detalle que despista: por defecto table() ignora los NA. Si quieres contarlos, hay que pedirlo:

datos <- c("sí", "no", NA, "sí", NA)

table(datos)
table(datos, useNA = "ifany")

Esa segunda versión es la que deberías usar al explorar datos nuevos → te enseña los huecos en lugar de esconderlos.

Y como table() devuelve un objeto ordenable, sacar el valor más frecuente es directo:

sort(table(colores), decreasing = TRUE)

Eso es justamente la base para calcular la moda, que R no trae de serie.