hllinas

1 Librerías

Primero, debemos instalar y descargar las librerías que vamos a utilizar.

library(dplyr)
library(openxlsx)   #Para exportar tablas de R a Excel

2 Data frame

Recuerde que el data frame (básicamente una tabla) es en realidad solo un tipo específico de otra estructura de datos (la lista). Actualmente, es el formato de entrada de nuestros datos más frecuente para los análisis estadísticos (dentro de R, pero también para otros programas estadísticos y, por supuesto, para softwares de hojas de cálculo). Por esta razón, primero, es importante importar/cargar los datos antes de iniciar nuestro análisis. Esto ya se explicó en el documento Rpubs :: Importar datasets.

En los documentos Rpubs :: Examinar data frames y Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames de las variables que contenidads en él. En Rpubs :: Recodificar variables describimos como recodificar las variables. Para más detalles relacionados con los data frames, se puede consultar el documento Rpubs :: data frames (generalidades).

3 Nuestro data frame

Vamos a utilizar un conjunto de datos, que fueron recogidos aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 400 observaciones y 46 variables, las cuales se describen en este enlace (click aquí). En este documento, se importará la base de datos desde una dirección web (dos opciones):

Opción A (web, desde github): Para esta opción, se necesita cargar la librería “repmis”:

library(repmis)
source_data("https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false")
datosCompleto <- Estudiantes

Opción B (web, desde Google Drive):

url.dat<- "http://bit.ly/Database-Estudiantes"
datosCompleto <- read.delim(url.dat)

Recuérdense las otras opciones, si tienen las bases de datos descargadas en su sesión de trabajo (ya sea en extensiones en Rdata, en excel o en otros formatos). Para más detalles, véase el documento RPubs :: Importar datasets básico. A manera de ejemplo:

Opción C (local, con archivo en Rdata):

load(file="Estudiantes.Rdata")
datosCompleto <- Estudiantes

Opción D (local, con archivo en excel):

datosCompleto <- read.delim('clipboard')

4 Funciones de R

Hay varias funciones que nos permiten construir tablas de frecuencias univariadas y de contiengencias (cruzadas). Son las siguientes:

  1. table.

  2. xtabs.

  3. ftable.

  4. pro.table.

Explicaremos cada una de ellas, con sus respectivos ejemplos. Adicionalmente, se va a explicar cómo se pueden exportar las tablas construidas a un archivo de excel (con ayuda de la función write.xlsx de la librería openxlsx).

5 Tablas univariadas (con table)

En esta sección, se va a construir una tabla de frecuencia no agrupada para una sola variable categórica. Se sugiere que la variable se convierta primero a factor (si R no la lee así). La tabla final contendrá los niveles de la variable, las frecuencias absolutas y los porcentajes.

Ejemplo 1 (tabla de frecuencias)

Supongamos que se quiere construir una tabla de frecuencias para la variable Sexo. Con str observamos que R la lee como una variable de tipo character (código A). Por esta razón, se sugiere convertirla a una de tipo factor, como se indica en el código B:

str(datosCompleto$Sexo)                    #A) Sale: chr [1:400] "Femenino" "Masculino" ...
Variable <- as.factor(datosCompleto$Sexo)  #B) Definiendo y convirtiendo en factor

Una vez hecho esto, procedemos a construir la tabla de frecuencias con la función table:

Cuentas <- table(Variable); Cuentas     #C) Calcular tabla de frecuencias
## Variable
##  Femenino Masculino 
##       211       189

Con class se determina la clase objeto que es Cuentas.

class(Cuentas)    #D) Sale: "table"

Ejemplo 2 (convertir tabla en data frame)

Como la tabla del ejemplo 1 no es data frame, podemos convertirla en uno de este tipo.

#D) Revisando la clase 
Cuenta <- as.data.frame(Cuentas); Cuenta     #E) Convirtiendo a data frame 
##    Variable Freq
## 1  Femenino  211
## 2 Masculino  189

Ejemplo 3 (tabla de frecuencias relativas)

La tabla del ejemplo1 se puede editar siguiendo las instrucciones que se muestran abajo:

porcentajes <- prop.table(Cuentas)                     #F) Calcular frecuencias relativas
porcentaje <- as.data.frame(porcentajes); porcentaje   #G) Convertir a data frame
##    Variable   Freq
## 1  Femenino 0.5275
## 2 Masculino 0.4725

Ejemplo 4 (unir frecuencias y frecuencias relativas)

Ahora uniremos las frecuencias y las frecuencias relativas (convirtiéndolas en porcentajes). Luego, editaremos los nombres de las columnas y generaremos la tabla definitiva.

Tabla1 <- data.frame(Cuentas, round(porcentaje[,2]*100, 2))         #H) Porcentajes
colnames(Tabla1) <- c("Variable", "Frecuencia", "Porcentaje (%)")   #I) Editar nombres
Tabla1                                                              #J) La tabla
##    Variable Frecuencia Porcentaje (%)
## 1  Femenino        211          52.75
## 2 Masculino        189          47.25

En este caso, la tabla de frecuencias que se quería construir es Tabla1, la cual ya es un data frame.

6 Tablas de contingencia (con xtabs)

En este capítulo, se va a construir una tabla de frecuencias para analizar la distribución conjunta de dos variables categóricas. Se sugiere que estas variables se conviertan primero a “factor” (si R no las lee así). Se va a utilizar la función xtabs, la cual crea una tabla de contingencia (opcionalmente una matriz dispersa) a partir de factores de clasificación cruzada, generalmente contenidos en un marco de datos y utilizando una interfaz de fórmula. Esta tabla es un objeto de R de clase “table”. El comando básico que se utiliza es:

xtabs(~ "Variable1" + "Variable2", data = "nuestro_data_frame")

La tabla final será una tabla de contingencia de 2x2 con los niveles de las dos variable y las frecuencias absolutas. Y luego, se va a explicar brevemente cómo se puede transportar esta tabla a un archivo de excel.

El procedimiento se puede extender a más de dos variables categóricas (digamos, por ejemplo, 4):

xtabs(~ "Variable1" +....+ "Variable4", data = "nuestro_data_frame")

En esta caso, para cada combinación de niveles de las variables 3 y 4, R presenta la tabla para las dos primeras variables.

Ejemplo 5 (tabla cruzada)

Supongamos que se quiere construir una tabla de frecuencias para analizar la distribución conjunta de las variables categóricas Sexo y Fuma. Como se explicó en el capítulo anterior, estas variables se definen de la siguiente manera (convirtiéndolas a tipo “factor”):

Variable1 <- as.factor(datosCompleto$Sexo)     #A)  Definiendo y convirtiendo en factor
Variable2 <- as.factor(datosCompleto$Fuma)     #B)  Definiendo y convirtiendo en factor 

Una vez hecho esto, procedemos a construir la tabla de frecuencias con la función xtabs:

Tabla2 <- xtabs(~ Variable1 +Variable2, data = datosCompleto); Tabla2   #C) Tabla con xtabs
##            Variable2
## Variable1    No  Si
##   Femenino  116  95
##   Masculino 109  80

Ejemplo 6 (tabla cruzada: agregar total por fila)

Ahora, procedemos a agregar los totales por filas (con cbind), como se muestra a continuación:

Tabla3 <- cbind(Tabla2, apply(Tabla2,1,sum)); Tabla3    #D) Total por fila
##            No Si    
## Femenino  116 95 211
## Masculino 109 80 189

Observe que:

  1. Con class(Tabla3), se puede revisar la clase de objeto que es Tabla3. Se observa que es una matriz (matrix) o un arreglo (array).

  2. Se ha utilizado apply para hacer las sumas correspondientes (por eso, se utilizó la operación sum). En general, esta función es usada para aplicar una función (una operación) a cada elemento de una estructura de datos, ya sea una matriz, un data frame, un arreglo (array) y/o una lista. La línea básica de comando de esta función es:

apply("estructura", 1, "operación")   #E) Para operar sobre las filas (por eso, 1)
apply("estructura", 2, "operación")   #F) Para operar sobre las columnas (por eso, 2)

Ejemplo 7 (tabla cruzada: agregar total por columna)

Ahora, a la matriz Tabla3 le agregamos los totales por columnas (con rbind), como se muestra a continuación:

Tabla4 <- rbind(Tabla3, apply(Tabla3,2,sum)); Tabla4  #H) Total por columna
##            No  Si    
## Femenino  116  95 211
## Masculino 109  80 189
##           225 175 400

Ejemplo 8 (tabla cruzada: editar nombres de filas y columnas)

Luego, editaremos los nombres de las filas y columnas y generaremos la tabla definitiva (el corchete [3] indica la tercera fila y columna de la matriz):

colnames(Tabla4)[3] <- c('Total')    #I) Nombre de las columnas        
rownames(Tabla4)[3] <- c('Total')    #J) Nombre de las filas

Finalmente, la tabla de frecuencias como data frame será:

Tabla4 <- as.data.frame(Tabla4); Tabla4             #K) La tabla en data frame
##            No  Si Total
## Femenino  116  95   211
## Masculino 109  80   189
## Total     225 175   400

7 Tablas de contingencia (con table)

El objetivo y las recomendaciones para este capítulo son las mismas que en el capítulo anterior. La única diferencia es que ahora utilizaremos la función “table”, en vez de xtabs. La función table usa los factores de clasificación cruzada para construir una tabla de contingencia de los conteos en cada combinación de los niveles de los factores. Esta tabla también es un objeto de R de clase table El comando básico que se utiliza es:

table("Variable1", "Variable2")

La tabla final también será una tabla de contingencia de 2x2 con: los niveles de las dos variable y las frecuencias absolutas. Y luego, se va a explicar brevemente cómo se puede transportar esta tabla a un archivo de excel.

El procedimiento se puede extender a más de dos variables categóricas (digamos, por ejemplo, 4):

table("Variable1", "Variable2", "Variable3", "Variable4")

En esta caso, para cada combinación de niveles de las variables 3 y 4, R presenta la tabla para las dos primeras variables.

Ejemplo 9 (tabla cruzada con table)

Supongamos que se quiere construir una tabla de frecuencias para analizar la distribución conjunta de las variables categóricas Sexo y Fuma, que son las mismas en comparación con la sección anterior, las cuales se deben definir como factores. La tabla de frecuencias de interés construída con table es:

Variable1 <- as.factor(datosCompleto$Sexo)     #A) Definiendo y convirtiendo en factor
Variable2 <- as.factor(datosCompleto$Fuma)     #B) Definiendo y convirtiendo en factor 
Tabla5 <- table(Variable1, Variable2)          #C) Tabla de frecuencias con table
Tabla5                                         #D) La tabla 
##            Variable2
## Variable1    No  Si
##   Femenino  116  95
##   Masculino 109  80

Ejemplo 10 (tabla cruzada: comparando xtabs y table)

Debido a que a todas las entradas lógicas son TRUE en:

Tabla2 == Tabla5    #E) Verificación de igualdad lógica
##            Variable2
## Variable1     No   Si
##   Femenino  TRUE TRUE
##   Masculino TRUE TRUE

podemos concluir que ambas funciones (xtabs y table) producen los mismos resultados.

Ejemplo 11 (tabla cruzada con table: editando)

Por consiguiente, los pasos a seguir son exactamente iguales a aquellos de la sección anterior:

Tabla6 <- cbind(Tabla5, apply(Tabla5,1,sum))     #F) Total por fila
Tabla7 <- rbind(Tabla6, apply(Tabla6,2,sum))     #G) Total por columna
colnames(Tabla7)[3] <- c('Total')                #H) Nombre de columnas
rownames(Tabla7)[3] <- c('Total')                #I) Nombre de filas
Tabla7 <- as.data.frame(Tabla7); Tabla7          #J) La tabla
##            No  Si Total
## Femenino  116  95   211
## Masculino 109  80   189
## Total     225 175   400

8 Tablas de contingencia (con ftable)

El objetivo y las recomendaciones para este capítulo son las mismas que en el capítulo anterior. La única diferencia es que ahora utilizaremos la función ftable. En general, ftable crea objetos que que contienen los recuentos de cada combinación de los niveles de las variables categóricas (“factores”) involucrados. El comando básico que se utiliza es ftable(x), donde x son objetos de R que pueden interpretarse como uno de los tres casos siguientes:

  1. Factores (incluídas strings de caracteres).

  2. Una lista (o data frame) cuyos componentes pueden interpretarse también como lista o data frame.

  3. Un objeto que es una tabla de contingencia de clase ftable o table.

  4. En este capítulo, utilizaremos la siguiente línea de comando base:

ftable(xtabs(~ "Variable1" + "Variable2", data = "nuestro_data_frame"))
  1. La tabla final será una tabla de contingencia de 2x2 con: los niveles de las dos variable y las frecuencias absolutas. Y luego, se va a explicar brevemente cómo se puede transportar esta tabla a un archivo de excel.

  2. El procedimiento se puede extender a más de dos variables categóricas (digamos, por ejemplo, 4):

ftable(xtabs(~ "Variable1" + "Variable2" + "Variable3" + "Variable4", data = "nuestro_data_frame"))
  1. En este caso, R presenta una sola tabla, organizando las frecuencias de las celdas por capas.

Ejemplo 12 (tabla cruzada con ftable)

Supongamos que se quiere construir una tabla de frecuencias para analizar la distribución conjunta de las variables categóricas Sexo y Fuma, que son las mismas en comparación con los capítulos anteriores. Como se explicó anteriormente, estas variables se deben definir como factores. Como ya se explicó anteriormente, xtabs(…) es un objeto de la clase table. Por esta razón, por el caso 3 (mencionado en la introducción de este capítulo), la función ftable puede actuar sobre él. De esta manera, la tabla de frecuencias de interés construída con ftable es:

Variable1 <- as.factor(datosCompleto$Sexo)                             #A) Factor
Variable2 <- as.factor(datosCompleto$Fuma)                             #B) Factor 
Tabla8 <- ftable(xtabs(~ Variable1 +Variable2, data = datosCompleto))  #C) Tabla ftable
Tabla8 <-as.data.frame(Tabla8); Tabla8                                 #D) En data frame
##   Variable1 Variable2 Freq
## 1  Femenino        No  116
## 2 Masculino        No  109
## 3  Femenino        Si   95
## 4 Masculino        Si   80

Con class(Tabla8), se pueden observar que Tabla8 ya es un data frame.

9 Tablas de contingencia (con prop.table)

Se va a repetir el ejemplo de los capítulos anteriores, pero ahora el objetivo es construir una tabla de porcentajes. Se va a construir la tabla de frecuencias con la función prop.table, la cual convierte las frecuencias de una tabla de contingencia en frecuencias relativas. La línea de comando básica es:

prop.table("NuestraTabla") 
  1. Por defecto, las proporciones se calculan sobre toda la tabla. Es decir, esa proporción es la frecuencia de la celda ij sobre total de la muestra. Todas las frecuencias relativas suman 1.

  2. Si se desean proporciones tomando como referencia el total de cada fila i, todo lo que necesita hacer es agregar el argumento margen=1. En este caso, cada fila suma 1. Es decir, esa proporción es la frecuencia de la celda ij sobre total de la fila i. La línea de comando sería:

prop.table("NuestraTabla", margen=1) 
  1. Si se desean proporciones tomando como referencia el total de cada columna j, todo lo que necesita hacer es agregar el argumento margen=2. En este caso, cada columna suma 1. Es decir, esa proporción es la frecuencia de la celda ij sobre total de la columna j. La línea de comando sería:
prop.table("NuestraTabla", margen=2) 

Ejemplo 13 (tabla cruzada con prop.table)

Las variables son las mismas de la sección anterior.

Variable1 <- as.factor(datosCompleto$Sexo)                             #A) Factor
Variable2 <- as.factor(datosCompleto$Fuma)                             #B) Factor 
Tabla9 <-xtabs(~ Variable1 +Variable2, data = datosCompleto); Tabla9   #C) Tabla con xtabs
##            Variable2
## Variable1    No  Si
##   Femenino  116  95
##   Masculino 109  80

Entonces, con ayuda de la función prop.table obtenemos una tabla de contingencia con elementos que son frecuencias relativas (las cuales convertimos inmediatamente en porcentajes):

Relativa <- prop.table(Tabla9)                   #D) Frecuencia relativa
Porcentaje <-round(Relativa*100,2); Porcentaje   #E) En porcentajes y redondeo
##            Variable2
## Variable1      No    Si
##   Femenino  29.00 23.75
##   Masculino 27.25 20.00

Ejemplo 14 (tabla cruzada con prop.table: total por fila)

Recuerde que, por defecto, las proporciones se calculan sobre toda la tabla. Es decir, cada proporción que calcula R es la frecuencia de la celda ij sobre total de la muestra. Observe que la suma de todas las frecuencias relativas es 1. Ahora, procedemos a agregar los totales por filas (con cbind, apply, 1, sum), como se muestra a continuación:

Tabla10 <- cbind(Porcentaje, apply(Porcentaje,1,sum)); Tabla10    #F) Total por fila
##              No    Si      
## Femenino  29.00 23.75 52.75
## Masculino 27.25 20.00 47.25

Observe que el objeto Tabla10 puede ser vista como una matriz (matrix) o como un arreglo (array) y que, al igual que en la sección anterior, también se ha utilizado apply para hacer las sumas correspondientes.

Ejemplo 15 (tabla cruzada con prop.table: total por columna)

Ahora, a la matriz Tabla10 le agregamos los totales por columnas (con rbind, apply, 2, sum), como se muestra a continuación:

Tabla11 <- rbind(Tabla10, apply(Tabla10,2,sum)); Tabla11    #G) Total por columna
##              No    Si       
## Femenino  29.00 23.75  52.75
## Masculino 27.25 20.00  47.25
##           56.25 43.75 100.00

Ejemplo 16 (tabla cruzada con prop.table: editar nombres)

Luego, editaremos los nombres de las columnas y generaremos la tabla definitiva.

colnames(Tabla11) <- c('Hombre (%)', 'Mujer (%)', 'Total (%)')   #H) Nombre de columnas
rownames(Tabla11)[3] <- c('Total')                               #I) Mombre de fila
Tabla11 <- as.data.frame(Tabla11); Tabla11                       #J) El data frame
##           Hombre (%) Mujer (%) Total (%)
## Femenino       29.00     23.75     52.75
## Masculino      27.25     20.00     47.25
## Total          56.25     43.75    100.00

10 Tablas de contingencia (más de dos variables)

Supongamos que se quiere construir una tabla de frecuencias no agrupadas con el fin analizar la distribución conjunta de más dos variables categóricas (digamos, 3). Se sugiere que estas variables se conviertan primero a factor (si R no las lee así).

Ejemplo 18 (tres variables)

A manera de ejemplo, supongamos que nuestras variables son:

Variable1 <- as.factor(datosCompleto$Sexo)      #A)  Factor
Variable2 <- as.factor(datosCompleto$Fuma)      #B)  Factor 
Variable3 <- as.factor(datosCompleto$SexoNum)   #C)  Factor

Para construir la tabla, nuevamente podemos utilizar las funciones mencionadas en secciones anteriores. Compare cómo R presenta cada una de ellas:

Ejemplo 18 (tabla cruzada con 3 variables: table)

Tabla12 <- table(Variable1, Variable2, Variable3); Tabla12    #D) "table"
## , , Variable3 = 0
## 
##            Variable2
## Variable1    No  Si
##   Femenino  116  95
##   Masculino   0   0
## 
## , , Variable3 = 1
## 
##            Variable2
## Variable1    No  Si
##   Femenino    0   0
##   Masculino 109  80

Ejemplo 19 (tabla cruzada con 3 variables: table)

Tabla13 <- xtabs(~ Variable1 +Variable2 + Variable3, data = datosCompleto); Tabla13 #E) "xtabs"
## , , Variable3 = 0
## 
##            Variable2
## Variable1    No  Si
##   Femenino  116  95
##   Masculino   0   0
## 
## , , Variable3 = 1
## 
##            Variable2
## Variable1    No  Si
##   Femenino    0   0
##   Masculino 109  80

Ejemplo 20 (tabla cruzada con 3 variables: table)

Tabla14 <- ftable(xtabs(~ Variable1 +Variable2 +Variable3, data = datosCompleto)); Tabla14   #F) "ftable"
##                     Variable3   0   1
## Variable1 Variable2                  
## Femenino  No                  116   0
##           Si                   95   0
## Masculino No                    0 109
##           Si                    0  80

11 Exportando tablas a excel

Se requiere la librería openxlsx (por eso, aparece en el prámbulo de este documento). Dentro de ella, se utilizará la función write.xlsx, que transporta un data.frame o una lista de data.frames a un archivo xlsx.

11.0.1 Una sola tabla

Antes de aplicar esta función, puede guardar un archivo .xls (que yo llamaré MiExcel) en alguna carpeta de su computador. En general, la línea de comando es:

write.xlsx("nuestro_data_frame", "path", sheetName="Hoja1")

Aquí, path es la ruta al archivo de salida MiExcel (utilizar / en vez de  en la ruta), sheetname es un character string (un caracter) con el nombre de la hoja de excel donde se guardará el data.frame (que yo llamaré Hoja1). No debe olvidarse que las asignaciones tanto para file como para sheetname deben escribirse entre comillas. Luego debe buscar ese archivo, abrirlo y editarlo de acuerdo a sus intereses. Es importante resaltar que, cada vez que usted quiera ejecutar la función write.xlsx, el archivo de excel debe estar cerrado.

Ejemplo 21 (exportando una tabla a excel)

Supongamos que queremos exportar la Tabla1 a excel y en la ruta path. Procedemos así:

path <-"G:/Mi unidad/OJO/Academico/Asignaturas/R/Mi Tabla Excel/MiExcel.xlsx"
write.xlsx(Tabla1, path, sheetName="Hoja1")

11.0.2 Varias tablas

También puede usar la biblioteca openxlsx para exportar múltiples conjuntos de tablas a múltiples hojas en un solo archivo de excel. En este caso, se debe escribir una lista de tablas en hojas de excel individuales utilizando los nombres de lista como nombres de hojas de excel.

Ejemplo 22 (exportando varias tablas a excel)

Supongamos que queremos exportar las siguientes tablas (construidas anteriormente): Tabla1, Tabla2, Tabla12 y Tabla14. Entonces, procedemos de la siguiente manera:

path <-"G:/Mi unidad/OJO/Academico/Asignaturas/R/Mi Tabla Excel/MiExcel.xlsx"
lista <- list("Hoja1" = Tabla1, "Hoja2" = Tabla2,  "Hoja3" = Tabla12,  "Hoja4" = Tabla14)
write.xlsx(lista, path)

12 Ejercicios

Crear un nuevo documento R Markdown, realizando las actividades que se indican abajo. En todos los casos, escribir las interpretaciones correspondientes. Además, exportar las tablas a excel (de manera individual y conjunta).

  1. Construir una tabla de frecuencias no agrupadas (univariada).

  2. Construir una tabla de contingencia con dos variables con:

    • xtabs.
    • table.
    • ftable.
    • prop.table.
  3. Repetir el ejercicio anterior para el caso de tener cuatro variables.

Bibliografía

  1. LLinás, H., Rojas, C. (2005); Estadística descriptiva y distribuciones de probabilidad. Barranquilla: Editorial Universidad del Norte.

  2. Consultar el documento RPubs :: Enlace y materiales de ayuda.

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.