hllinas2023

1 Introducción

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

library(dplyr)

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 el documento Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames. En este documento, explicaremos como filtrar data frames. 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 R 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 Operadores relacionales y lógicos

Regularmente, necesitamos condicones para filtrar data frames. Estas condiciones pueden ser expresiones lógicas construidas mediante los operadores relacionales (Comparison) y lógicos (base::Logic), como se muestra en la Figura de abajo:

Operadores relacionales y lógicos.  Fuente: Elaboración propia.

Operadores relacionales y lógicos. Fuente: Elaboración propia.

5 Funciones para filtar en R

Hay variables funciones que nos permiten filtrar data frames y son (las cuales se explicarán en las secciones siguientes):

  1. Función corchete.

  2. Función subset.

  3. Función sample.

  4. Función filter de la base de R.

  5. Función filter del paquete dplyr.

6 La función corchete

Una opción es ejecutando datosCompleto[i,j], donde i y j son las filas y columnas que se va a utilizar o quitar, respectivamente.

  1. Si escribimos datosCompleto[ , j] (sin información para la fila i), indicaremos que queremos construir un data frame que tenga en cuenta todas las filas (observaciones), pero solo la columna (variable) j.

  2. Si escribimos datosCompleto[i, ] (sin información para la columna j), indicaremos que queremos construir un data frame que tenga en cuenta solo la fila (observación) i, pero con todas las columnas (variables).

  3. Las expresiones -i, -j (con el signo menos), indicarán quitar la fila i y/o la columna j.

  4. Lo anterior también es válidos para vectores.

Ejemplo 1

Supongamos que solo necesito un data frame que contenga solo las observaciones de 1 a 4, con las columnas 2 a 5. Para ello, podemos utilizar la función corchete [] y la función dos puntos :.

Muestra1 <- datosCompleto[1:10,2:7]       # A) Un nuevo data frame 
Muestra1
ID Sexo SexoNum Edad Fuma Estatura
SB11201910010435 Femenino 0 21.36 No Alta
SB11201910004475 Masculino 1 21.07 Si Baja
SB11201910011427 Masculino 1 20.92 Si Alta
SB11201910041975 Masculino 1 18.41 Si Alta
SB11201910013623 Femenino 0 16.64 Si Alta
SB11201910038122 Femenino 0 16.02 No Baja
SB11201910037905 Femenino 0 19.32 Si Baja
SB11201910038140 Femenino 0 18.62 Si Media
SB11201910038005 Femenino 0 17.01 Si Media
SB11201910037919 Masculino 1 19.71 Si Media

Ejemplo 2

A continuación, se muestran algunas filtraciones del data frame Muestra1 (definido en el ejemplo 1):

Muestra1[3,2]           # A) Solo la fila 3 y la columna 2
Muestra1[,2]            # B) Todas las filas (por el espacio en blanco) y solo la columna 2
Muestra1[3,]            # C) Solo la fila 3 y todas las columnas (por el espacio en blanco)
Muestra1[-5, ]          # D) Quitar la fila 5 (por eso el signo menos) y dejar todas las columnas
Muestra1[,-2]           # E) Todas las filas, pero sin la columna 2 (por eso, el signo menos)
Muestra1[,2:5]          # F) Todas las filas, pero solo columnas de 2 a 5 (por eso, dos puntos)
Muestra1[,c(2,5)]       # G) Todas las filas, pero solo columnas 2 y 5 (*c* representa un vector)
Muestra1[1:4,2:5]       # H) Solo las filas de 1 a 4, con las columnas 2 a 5 
Muestra1[1:4,c(2,5)]    # I) Solo las filas de 1 a 4, con las columnas 2 y 5 
Muestra1[c(1,5),c(2,4)] # J) Solo las filas 1 y 5, con las columnas 2 y 4 
Muestra1[1:5,-c(2,5)]   # K) Solo las filas de 1 a 5, quitando las columnas 2 y 5 
Muestra1[-3,-c(2,5)]    # L) Quitar la filas 3, y las columnas 2 y 5 

7 La función subset

La función subset es otra manera utilizada para seleccionar variables, observaciones y/o niveles de una variables.

Ejemplo 2

En el siguiente ejemplo, construimos una nueva base de datos que contiene solo las variables ID, Edad y Fuma.

Muestra2 <- subset(Muestra1, select = c(ID,Edad, Fuma))  #A) Una nueva base de datos
ID Edad Fuma
SB11201910010435 21.36 No
SB11201910004475 21.07 Si
SB11201910011427 20.92 Si
SB11201910041975 18.41 Si
SB11201910013623 16.64 Si
SB11201910038122 16.02 No
SB11201910037905 19.32 Si
SB11201910038140 18.62 Si
SB11201910038005 17.01 Si
SB11201910037919 19.71 Si

Ejemplo 3

En este otro ejemplo construimos otra base de datos seleccionando todas las filas que tienen una edad mayor o igual que 20, pero sin las columnas ID y Fuma (por eso, el signo menos).

Muestra3 <- subset(Muestra1, Edad >= 20, select = -c(ID,Fuma))  #B) Otra base de datos
Sexo SexoNum Edad Estatura
Femenino 0 21.36 Alta
Masculino 1 21.07 Baja
Masculino 1 20.92 Alta

Ejemplo 4

Construiremos otra base de datos seleccionando todas las filas que tienen una edad menor o igual que 18 o mayor que 21, pero sin las columnas ID y Fuma. Se utilizará el símbolo | para el conectivo lógico o.

Muestra4 <- subset(Muestra1, Edad <= 18 | Edad > 21, select = -c(ID,Fuma))  #C) Otra base de datos
Sexo SexoNum Edad Estatura
Femenino 0 21.36 Alta
Masculino 1 21.07 Baja
Femenino 0 16.64 Alta
Femenino 0 16.02 Baja
Femenino 0 17.01 Media

Ejemplo 5

Construiremos otra base de datos seleccionando todas las filas que tienen una edad menor que 18 y menor o igual que 21, pero sin las columnas ID y Fuma. Se utilizará el símbolo & para el conectivo lógico y.

Muestra5 <- subset(Muestra1, Edad < 18 & Edad <= 21, select = -c(ID,Fuma))  #D) Otra base de datos
Sexo SexoNum Edad Estatura
Femenino 0 16.64 Alta
Femenino 0 16.02 Baja
Femenino 0 17.01 Media

Ejemplo 6

En este ejemplo, se constuyen varios data frames, con el fin de mostrar la utilidad de subset. Se deja al lector sus respectivas visualizaciones.

Muestra6a <- subset(Muestra1, Muestra1$Fuma=="Si")             #E) Solo fumadores
Muestra6b <- subset(Muestra1, Muestra1$Fuma!="No")             #F) Solo fumadores (por el símbolo !=)
Muestra6c <- subset(Muestra1, Muestra1$SexoNum=="0" & Muestra1$Edad > 21)  #G) Otro data frame

8 La función sample

La función sample se utiliza para tomar una muestra aleatoria de tamaño \(n\) de un conjunto de datos. El muestreo se puede hacer con reemplazo y sin reemplazo. Es importante resaltar que, cada vez que llamamos sample, se generan muestras aleatorias diferentes. Pero, si antes fijamos una semilla de R (con set.seed), con un número específico como argumento, obtendremos los mismos resultados cada vez que se ejecute el comando.

Ejemplo 7

Supongamos que se desea tomar una muestra aleatoria (sin reemplazo) de tamaño \(n=2\) del data frame Muestra1 (véase el ejemplo 1).

f <- nrow(Muestra1)                 #A) Tamaño del data frame de referencia. Sale: 6
n <- 2                              #B) Tamaño de la nueva muestra aleatoria. Sale: 2
i <- sample(1:f, n, replace=FALSE)  #C) Posiciones de las observaciones aleatorias. 
Muestra7 <- Muestra1[i,]            #D) La nueva muestra aleatoria
Muestra7                            #E) Mostrando esa muestra
ID Sexo SexoNum Edad Fuma Estatura
SB11201910004475 Masculino 1 21.07 Si Baja
SB11201910038122 Femenino 0 16.02 No Baja

Ejemplo 8

Supongamos que se desea tomar una muestra aleatoria (sin reemplazo) de tamaño \(n=2\) del data frame Muestra1 (véase el ejemplo 1). Compare la Muestra7 con la Muestra6.

f <- nrow(Muestra1)                 #A) Tamaño del data frame de referencia. Sale: 6
n <- 2                              #B) Tamaño de la nueva muestra aleatoria. Sale: 2
i <- sample(1:f, n, replace=FALSE)  #C) Posiciones de las observaciones aleatorias. Sale: 2 3
Muestra8 <- Muestra1[i,]            #D) La nueva muestra aleatoria
Muestra8                            #E) Mostrando esa muestra
ID Sexo SexoNum Edad Fuma Estatura
SB11201910038140 Femenino 0 18.62 Si Media
SB11201910037905 Femenino 0 19.32 Si Baja

Ejemplo 9

Supongamos que se desea tomar una muestra aleatoria (sin reemplazo) de tamaño \(n=2\) del data frame Muestra1 (véase el ejemplo 1). En esta caso, fijaremos una semilla.

set.seed(1)                         #A) Fijando la semilla
f <- nrow(Muestra1)                 #B) Tamaño del data frame de referencia. Sale: 6
n <- 2                              #C) Tamaño de la nueva muestra aleatoria. Sale: 2
i <- sample(1:f, n, replace=FALSE)  #D) Posiciones de las observaciones aleatorias. Sale: 1 4
Muestra9 <- Muestra1[i,]            #E) La nueva muestra aleatoria
Muestra9                            #F) Mostrando esa muestra
ID Sexo SexoNum Edad Fuma Estatura
SB11201910038005 Femenino 0 17.01 Si Media
SB11201910041975 Masculino 1 18.41 Si Alta

Ejemplo 10

Supongamos que se desea tomar una muestra aleatoria (sin reemplazo) de tamaño \(n=2\) del data frame Muestra1 (véase el ejemplo 1), pero solo con las 3 últimas variables (Edad, Fuma y Estatura).

set.seed(1)                         #A) Fijando la semilla
f <- nrow(Muestra1)                 #B) Tamaño del data frame de referencia. Sale: 6
n <- 2                              #C) Tamaño de la nueva muestra aleatoria. Sale: 2
i <- sample(1:f, n, replace=FALSE)  #D) Posiciones de las observaciones aleatorias. Sale: 1 4
Muestra10  <- Muestra1[i,4:6]         #E) La nueva muestra aleatoria
Muestra10                            #F) Mostrando esa muestra
Edad Fuma Estatura
17.01 Si Media
18.41 Si Alta

9 La función filter

La función filter nos permite filtrar filas según una condición. Es muy similar a las funciones anteriores.

Ejemplo 10

En este ejemplo, se constuyen varios data frames, con el fin de mostrar la utilidad de filter, combinado con los operadores de relaciones y/o lógicos. Solo se muestran los data frames Muestra10c y Muestra10d con el único fin de comparar los resultados obtenidos al utilizar los operadores & y |. Las respectivas visualizaciones de los otros data frames se dejan al lector como ejercicios.

Muestra10a <- filter(Muestra1, Edad >= 20)
Muestra10b <- filter(Muestra1, Edad >= 20 & SexoNum < 1)

Muestra10c <- filter(Muestra1[,2:4], Edad >= 20 & Sexo == "Femenino") 
Muestra10d <- filter(Muestra1[,2:4], Edad >= 20 | Sexo == "Femenino") 

Muestra10e <- filter(Muestra1, Edad >= 20 & Sexo != "Masculino") 
Muestra10f <- filter(Muestra1, Edad >= 20 | Sexo == "Femenino") 
Muestra10g <- filter(Muestra1, Edad <  20 | Estatura != "Alta") 
Muestra10h <- filter(Muestra1, Edad >= 18, Estatura %in% c("Baja", "Media", "Gigante"))
Muestra10i <- filter(Muestra1, SexoNum != 1, Fuma %in% c("Si", "Enfermo", "Delicado"))
Visualizaciones de los dataframes *Muestra1*, *Muestra10c* y *Muestra10d*.  Fuente: Elaboración propia.

Visualizaciones de los dataframes Muestra1, Muestra10c y Muestra10d. Fuente: Elaboración propia.

Se observa que tanto Muestra10c como Muestra10d contienen las mismas variables, ya que ambas se han restringido a través de Muestra1[,2:4]. Además, la primera contiene solo la observación 1, ya que esta es la cumple la condición simultánea de que Edad >= 20 y Sexo == “Femenino”. Mientras tanto, esta observación y otras más cumplen la condición (no necesariamente simultánea) de que Edad >= 20 o Sexo == “Femenino”.

10 La función filter de dplyr

10.0.1 Gramática

La librería dplyr proporciona una “gramática” (particularmente ““verbos”) para la manipulación y operaciones con data frames.

  1. Uno de estos “verbos” es %>% (el llamado operador pipe), el cual nos permite:

    • Concatenar múltiples operaciones.

    • Escribir una secuencia de operaciones de izquierda a derecha en una única pipeline (tubería).

  2. Otro verbo es la función filter, el cual es la función que nos permitirá filtrar filas según una o varias condiciones (relacionales o lógicas) dadas para una o varias variables (numérica o categórica).

  3. En general, la instrucción básica de escritura es alguna de las dos opciones (Nuevo_nombre es el nombre del nuevo data frame):

"data.frame" %>%  filter("condiciones") -> "Nuevo_nombre"   #Primera opción
"Nuevo_nombre" <- "data.frame" %>%  filter("condiciones")   #Segunda opción
  1. Aunque también se puede utilizar la siguiente sintaxis (equivalente a la presentada en el punto No. 3 y a la explicada en la sección anterior):
"Nuevo_nombre" <- dplyr::filter("data.frame", "condiciones")  

Los cuatro puntos :: indican que la función filter pertenece a la librería dplyr.

10.0.2 Ejemplos con dplyr

Ejemplo 10 (solo mujeres)

Se escribe la base de datos (Muestra1). Luego, la operación %>%, seguido de la función filter. Finalmente, se le asigna un nombre a esta nueva base de datos.

Muestra1 %>%  filter(Sexo=="Femenino")-> Mujeres  #A) La nueva base de datos

Se puede revisar con la opción names cuáles variables contiene nuestro nuevo data frame Mujeres.

Mujeres %>% names     #B) Revisar las variables 
names(Mujeres)        #C) Igual que antes

Las variables dentro de este nuevo data frame deben recibir un nuevo nombre. Por ejemplo, así:

Codigo_M <- Mujeres$ID    #D)
Sexo_M <- Mujeres$Sexo    #E)
Edad_M <- Mujeres$Edad    #F)
Fuma_M <- Mujeres$Fuma    #G)

Ejemplo 11 (solo hombres)

Muestra1%>%  filter(Sexo=="Masculino") -> Hombres  #A)

Se puede revisar con la opción names cuáles variables contiene nuestro nuevo data frame Hombres.

Hombres %>% names     #B) Revisar las variables 
names(Hombres)        #C) Igual que antes

Las variables dentro de esta nuevo data frame deben recibir un nuevo nombre. Por ejemplo, así:

Codigo_H <- Hombres$ID   #D)
Sexo_H <- Hombres$Sexo   #E)
Edad_H <- Hombres$Edad   #F)
Fuma_H <- Hombres$Fuma   #G)

<

Ejemplo 11 (otros data frames)

Muestra11a <- Muestra1 %>% filter(Edad>17)             
Muestra11b <- Muestra1 %>% filter(SexoNum=="1")      
Muestra11c <- Muestra1 %>% filter(Edad >= 20)
Muestra11d <- Muestra1 %>% filter(Edad >= 20 & SexoNum < 1)

Muestra11e <- Muestra1[,2:4] %>% filter(Edad >= 20 & Sexo == "Femenino") 
Muestra11d <- Muestra1[,2:4] %>% filter(Edad >= 20 | Sexo == "Femenino") 

Muestra11f <- Muestra1 %>% filter(Edad >= 20 & Sexo != "Masculino") 
Muestra11g <- Muestra1 %>% filter(Edad >= 20 | Sexo == "Femenino") 
Muestra11h <- Muestra1 %>% filter(Edad <  20 | Estatura != "Alta") 
Muestra11i <- Muestra1 %>% filter(Edad >= 18, Estatura %in% c("Baja", "Media", "Gigante"))
Muestra11j <- Muestra1 %>% filter(SexoNum != 1, Fuma %in% c("Si", "Enfermo", "Delicado"))

11 Ejercicios

Crear un nuevo documento R Markdown, realizando las siguientes actividades.

  1. Filtrar el data frame con el fin de obtener tres (3) nuevos data frames, por cada uno de los siguientes métodos que se mencionan abajo. En todos los casos, revisar y definir nuevas variables.
  1. La función corchete.
  2. La función subset.
  3. La funciòn sample.
  4. La función filter de la librería base de R
  5. La función filter de la librería dplyr.
  1. Revisar y analizar todas las muestras mencionadas en este documento.

Bibliografía

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

 

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