Filtrar filas en R con dplyr
La función filter de dplyr permite seleccionar filas de un data frame en base a una o varias condiciones. En este tutorial aprenderás a seleccionar filas utilizando operadores de comparación y lógicos y a filtrar por número de fila con slice.
Conjunto de datos
Los ejemplos de este tutorial utilizan el conjunto de datos women proporcionado por R. Este conjunto de datos contiene dos columnas numéricas: height y weight.
# install.packages("dplyr")
library(dplyr)
# Sample data frame
df <- as_tibble(women)
df
# A tibble: 15 × 2
height weight
<dbl> <dbl>
1 58 115
2 59 117
3 60 120
4 61 123
5 62 126
6 63 129
7 64 132
8 65 135
9 66 139
10 67 142
11 68 146
12 69 150
13 70 154
14 71 159
15 72 164
Filtrar filas en base a una condición
La función filter permite seleccionar filas de un data frame basándose en una condición. Puedes filtrar los valores que sean iguales, no iguales, menores o mayores que un valor especificando la condición deseada dentro de la función.
La siguiente tabla contiene los operadores de comparación en R y su correspondiente descripción.
| Operador de comparación | Descripción |
|---|---|
| > | Mayor que |
| < | Menor que |
| >= | Mayor o igual que |
| <= | Menor o igual que |
| == | Igual a |
| != | Distinto a |
Por ejemplo, si quieres filtrar las filas en las que la columna height es mayor que 68 puedes escribir lo siguiente:
library(dplyr)
df <- as_tibble(women)
# Filas con la variable 'height' mayor a 68
df_2 <- df %>%
filter(height > 68)
df_2
height weight
<dbl> <dbl>
1 69 150
2 70 154
3 71 159
4 72 164

El filtrado de filas puede basarse en una función. El siguiente ejemplo selecciona las filas del data frame en las que la altura (height) es igual o inferior a la media de la columna.
library(dplyr)
df <- as_tibble(women)
# Filas con la variable 'height' menor o igual a su media
df_2 <- df %>%
filter(height <= mean(height))
df_2
# A tibble: 8 × 2
height weight
<dbl> <dbl>
1 58 115
2 59 117
3 60 120
4 61 123
5 62 126
6 63 129
7 64 132
8 65 135

También es posible filtrar filas utilizando operadores lógicos o funciones que devuelven TRUE o FALSE o una combinación de ellos. Los más comunes se muestran en la siguiente tabla.
| Operador/función | Descripción |
|---|---|
| ! | Negación lógica ‘NO’ |
| %in% | En el conjunto |
| !(x %in% y) | x no en y |
| is.na() | Es NA |
| !is.na() | No es NA |
| grepl() | Contiene un patrón |
| !grepl() | No contiene un patrón |
Considera que quieres filtrar las filas en las que la columna height toma el valor 65, 70 y 72. Para ello puedes utilizar el operador %in% y filtrar las filas en base a un vector.
library(dplyr)
df <- as_tibble(women)
# Filas con 'height' igual a 65, 70 y 72
df_2 <- df %>%
filter(height %in% c(65, 70, 72))
df_2
# A tibble: 3 × 2
height weight
<dbl> <dbl>
1 65 135
2 70 154
3 72 164

El opuesto de una condición puede seleccionarse con el operador lógico de negación !. El siguiente ejemplo muestra cómo seleccionar lo contrario del filtro realizado en el código anterior.
library(dplyr)
df <- as_tibble(women)
# Filas con 'height' DISTINTO a 65, 70 y 72
df_2 <- df %>%
filter(!(height %in% c(65, 70, 72)))
df_2
# A tibble: 12 × 2
height weight
<dbl> <dbl>
1 58 115
2 59 117
3 60 120
4 61 123
5 62 126
6 63 129
7 64 132
8 66 139
9 67 142
10 68 146
11 69 150
12 71 159

Para filtrar filas que contengan un texto específico puedes utilizar grepl o str_detect. El siguiente ejemplo filtra las filas que contienen un patrón específico (por ejemplo, filas de height que contienen un 5).
library(dplyr)
df <- as_tibble(women)
# Filas que contienen un 5 dentro de los valores de 'height'
df_2 <- df %>%
filter(grepl("5", height))
df_2
# A tibble: 3 × 2
height weight
<dbl> <dbl>
1 58 115
2 59 117
3 65 135

Varias condiciones
La selección de filas también puede basarse en múltiples condiciones para filtrar, por ejemplo, filas en las que un valor se encuentra en un rango específico o para filtrar entre fechas. Para ello tendrás que utilizar operadores lógicos, como & para especificar una condición Y otra, y | para especificar una condición U otra.
| Operador lógico | Descripción |
|---|---|
| & | Comparación lógica ‘AND’ (Y) |
| | | Comparación lógica ‘OR’ (O) |
| xor() | Exclusión ‘OR’. Equivalente a !(x | y) |
El ejemplo siguiente selecciona las filas cuyos valores en la columna height son superiores a 65 e inferiores a 68.
library(dplyr)
df <- as_tibble(women)
# Filas con 'height' superior a 65 Y menor a 68
df_2 <- df %>%
filter(height > 65 & height < 68)
df_2
# A tibble: 2 × 2
height weight
<dbl> <dbl>
1 66 139
2 67 142

Las condiciones múltiples pueden basarse en varias columnas. En el siguiente bloque de código estamos seleccionando las filas cuyos valores en height son superiores a 65 y cuyos valores en weight son inferiores o iguales a 150.
library(dplyr)
df <- as_tibble(women)
# Filas con 'height' mayor a 65 y 'weight' menor o igual a 150
df_2 <- df %>%
filter(height > 65 & weight <= 150)
df_2
# A tibble: 4 × 2
height weight
<dbl> <dbl>
1 66 139
2 67 142
3 68 146
4 69 150

En caso de que necesites filtrar filas en base a una condición O en otra puedes utilizar |. El ejemplo siguiente filtra las filas cuyos valores en height son mayores que 65 o cuyos valores en weight son mayores o iguales que 150.
library(dplyr)
df <- as_tibble(women)
# Filas con 'height' mayor a 65 O 'weight' mayor o igual a 150
df_2 <- df %>%
filter(height > 65 | weight >= 150)
df_2
# A tibble: 7 × 2
height weight
<dbl> <dbl>
1 66 139
2 67 142
3 68 146
4 69 150
5 70 154
6 71 159
7 72 164

Filtrar por numero de fila con slice
Una función similar relacionada con filter es slice, que permite filtrar filas basándose en su posición/índice. La función toma una secuencia o vector de índices (enteros) como entrada, como se muestra a continuación.
library(dplyr)
df <- as_tibble(women)
# Tres primeras filas
df_2 <- df %>%
slice(1:3)
df_2
# A tibble: 3 × 2
height weight
<dbl> <dbl>
1 58 115
2 59 117
3 60 120

Además, la función slice_head permite seleccionar la primera fila del data frame. Esta función proporciona un argumento llamado n para seleccionar las n primeras filas.
library(dplyr)
df <- as_tibble(women)
# Primera fila
df_2 <- df %>%
slice_head()
df_2
# A tibble: 1 × 2
height weight
<dbl> <dbl>
1 58 115

Por último, si necesitas seleccionar la última fila puedes utilizar slice_tail. Esta función también proporciona un argumento llamado n para seleccionar las últimas n filas del data frame.
library(dplyr)
df <- as_tibble(women)
# Última fila
df_2 <- df %>%
slice_tail()
df_2
# A tibble: 1 × 2
height weight
<dbl> <dbl>
1 72 164

slice_sample selecciona filas aleatoriamente y slice_min y slice_max seleccionan las filas con los valores más bajos o altos de una variable, respectivamente.