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.