Filtrar filas en R con dplyr

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

Filtrar filas con dplyr en R con la función filter()

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

Filtrar filas en dplyr en base a la media

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

Seleccionar filas con dplyr en R

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

Seleccionar las filas que no estén en un vector en R con dplyr

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

Subconjunto de filas que contienen una cadena de texto con la función filter de dplyr y grepl en R

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

Filtrar filas en base a varias condiciones con dplyr

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

Filtrar filas con dplyr en función de varias condiciones

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

Subconjunto de filas basado en una condición o en otra con la función de filter del paquete dplyr

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

Primeras filas de un data frame con la función slice de dplyr

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

Primera fila de un data frame con la función slice_head de dplyr

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

Última fila de un data frame con la función slice_tail de dplyr

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.