22/07/25
Abstract
En el documento RPubs :: Enlaces y materiales puede consultarse la teoría mencionada. En Rpubs :: toc se pueden ver otros documentos de posible interés.
Primero, debemos instalar y descargar las librerías que vamos a utilizar.
library(dplyr)
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).
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')
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.
Hay variables funciones que nos permiten filtrar data frames y son (las cuales se explicarán en las secciones siguientes):
Función corchete.
Función subset.
Función sample.
Función filter de la base de R.
Función filter del paquete dplyr.
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.
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.
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).
Las expresiones -i, -j (con el signo menos), indicarán quitar la fila i y/o la columna j.
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
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
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 |
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.
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”.
La librería dplyr proporciona una “gramática” (particularmente ““verbos”) para la manipulación y operaciones con data frames.
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).
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).
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
"Nuevo_nombre" <- dplyr::filter("data.frame", "condiciones")
Los cuatro puntos :: indican que la función filter pertenece a la librería 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"))
Crear un nuevo documento R Markdown, realizando las siguientes actividades.
Consultar el documento RPubs :: Enlace y materiales de ayuda.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.