R Seleccionar(), Filtro(), Organizar(), Canalización con ejemplo

⚡ Resumen inteligente

En R, `Select`, `Filtrar` y `Arrange` son los tres verbos de `dplyr` que reducen un marco de datos al orden de columnas, filas y columnas que necesitas. Este tutorial los combina con el operador de tubería en un conjunto de datos de tiempos de viaje de 205 filas.

  • 📋 Selección de columna: select(df, A, B) conserva las columnas con nombre, select(df, A:C) conserva un rango y select(df, -C) elimina una.
  • 🔎 Filtrado de filas: filter(df, condition) conserva las filas coincidentes, y las condiciones se combinan con el signo de ampersand para AND o la barra vertical para OR.
  • 🔣 Clasificación: La función arrange() ordena las filas de forma ascendente por defecto, y desc() invierte el orden de cualquier columna.
  • 🔗 Tuberias Operacolina: El operador %>% pasa cada resultado directamente al siguiente verbo, por lo que ningún objeto intermedio ensucia el entorno.
  • 🧹 Funciones auxiliares: starts_with(), contains() y where() seleccionan columnas por patrón o tipo en lugar de por nombre.
  • 📐 El orden de los verbos importa: Filtrar los datos al principio para reducir su tamaño, luego seleccionarlos y, finalmente, organizarlos, lo que abarata todos los pasos posteriores.

R Seleccionar Filtro Organizar Tubería

¿Qué es dplyr en R?

dplyr es el paquete de manipulación de datos de tidyverse. Reemplaza la notación de corchetes de base R con un pequeño conjunto de verbos, cada uno nombrado según la acción que realiza y cada uno tomando el marco de datos como su primer argumento. Esa estructura consistente es lo que permite encadenar los verbos.

Verb Actúa sobre ¿Qué hace?
Seleccione() Columnas Conserva o elimina variables
filtrar() filas Mantiene las filas que coinciden con una condición.
arreglar() filas Reordena las filas por una o más columnas.
mudar() Columnas Crea o modifica una variable.
resumir() Mesa entera Combina varias filas en una sola estadística.
agrupar_por() Mesa entera Divide los datos para que los verbos posteriores se ejecuten por grupo.

Este tutorial cubre los tres primeros verbos más la tubería. Tutorial sobre la función agregada Cubre en profundidad las funciones group_by() y summarise().

Conjunto de datos utilizado en este tutorial

La biblioteca dplyr contiene verbos útiles para navegar dentro del conjunto de datos. En este tutorial, utilizará el conjunto de datos de tiempos de viaje. Este conjunto registra los viajes que realiza un conductor entre su casa y su lugar de trabajo. El conjunto de datos contiene catorce variables, entre ellas:

  • DayOfWeek: Identifica el día de la semana en el que el conductor utiliza su coche
  • Distancia: La distancia total del viaje.
  • MaxSpeed: La velocidad máxima del viaje.
  • TotalTime: La duración en minutos del viaje.

El conjunto de datos contiene 205 observaciones, y los viajes se realizaron desde Monday para el viernes.

En primer lugar, necesitas:

  • cargar el conjunto de datos
  • comprobar la estructura de los datos.

Una función muy útil de dplyr es glimpse(). Cumple la misma función que la función str() de R base, pero imprime una fila por variable con el tipo y los primeros valores, lo que facilita mucho el análisis de un conjunto de datos extenso.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

Salida:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

La variable Comentarios necesita sin duda un análisis más detallado: las primeras observaciones están todas vacías.

sum(df$Comments =="")

Code Explicación

  • sum(df$Comments == “”): Cuenta las observaciones iguales a una cadena vacía en la columna Comments de df.

Salida:

## [1] 181

Una vez cargados los datos, comience con el verbo que recorta las columnas.

Seleccione()

Comenzaremos con el verbo select(). No necesariamente necesitamos todas las variables y una buena práctica es seleccionar solo las variables que considere relevantes.

Nos faltan 181 observaciones, casi el 90 por ciento del conjunto de datos. Si decide excluirlos, no podrá continuar con el análisis.

La otra posibilidad es eliminar la variable Comentario con el verbo select().

Podemos seleccionar variables de diferentes maneras con select(). Tenga en cuenta que el primer argumento es el conjunto de datos.

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

Puede utilizar la tercera forma de excluir la variable Comentarios.

step_1_df <- select(df, -Comments)
dim(df)

Salida:

## [1] 205  14
dim(step_1_df)

Salida:

## [1] 205  13

El conjunto de datos original tiene 14 funciones, mientras que step_1_df tiene 13.

Funciones auxiliares select() en R

Nombrar cada columna se vuelve poco práctico cuando un conjunto de datos tiene docenas de variables. dplyr incluye funciones auxiliares que permiten seleccionar columnas por patrón o por tipo.

Ayudante Selecciona columnas que Ejemplo
comienza_con() Comienza con una cuerda seleccionar(df, comienza_con(“Promedio”))
termina_con() Terminar con una cadena seleccionar(df, termina_con(“Tiempo”))
contiene () Contiene una cadena en cualquier lugar seleccionar(df, contiene(“Velocidad”))
partidos() Coincidir con una expresión regular seleccionar(df, coincidencias(“^Máx|^Promedio”))
dónde() Satisfacer una prueba de tipo seleccionar(df, donde(es.numérico))
todo() Aún no se les ha puesto nombre. seleccionar(df, TiempoTotal, todo())
# Keep only the timing columns
df %>% select(ends_with("Time"))

# Keep every numeric column
df %>% select(where(is.numeric))

# Move TotalTime to the front, keep the rest in place
df %>% select(TotalTime, everything())

Dos verbos más combinan naturalmente con select(). Use rename(new_name = old_name) para renombrar una columna sin eliminar ninguna columna.ping Los demás, y relocate() para mover columnas sin listarlas todas.

filtrar()

El verbo filter() conserva las observaciones que cumplen una condición. filter() funciona exactamente igual que select(), primero se pasa el marco de datos y luego una condición separada por una coma:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Un criterio

En primer lugar, puede contar el número de observaciones dentro de cada nivel de una variable factorial.

table(step_1_df$GoingTo)

Code Explicación

  • table(): Cuenta el número de observaciones por nivel. Espera una variable de tipo factor o carácter.
  • tabla(step_1_df$GoingTo): Cuenta el número de viajes hacia cada destino

Salida:

## 
##  GSK Home 
##  105  100	

La tabla de funciones() indica que 105 viajes van a GSK y 100 a casa.

Podemos filtrar los datos para devolver un conjunto de datos con 105 observaciones y otro con 100 observaciones.

# Select observations where GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Salida:

## [1] 100  14
# Select observations where GoingTo == GSK (work)
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Salida:

## [1] 105  14

Criterios múltiples

Podemos filtrar un conjunto de datos con más de un criterio. Por ejemplo, puedetracen las observaciones donde el destino es Casa y el viaje ocurrió un miércoles.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Salida:

## [1] 23 14

23 observaciones coincidieron con este criterio.

Condiciones comunes del filtro() y Operatores en R

La función filter() conserva todas las filas cuya condición se evalúa como VERDADERA. Las filas que se evalúan como NA se descartan, lo cual es un comportamiento que sorprende a la mayoría de los principiantes.

Operator Significado Ejemplo
== Igual a filtrar(df, GoingTo == “Home”)
!= No igual a filtro(df, DayOfWeek != “Monday")
& Y ambos deben cumplir filtro(df, Distancia > 50 y Velocidad máxima > 130)
| O bien, cualquiera de los dos puede contener filtrar(df, DayOfWeek == “Monday” | Día de la semana == “Viernes”)
%en% Coincide con cualquier valor en un vector. filtro(df, DíaDeLaSemana %en% c(“Monday", "Viernes"))
Entre() Se encuentra dentro de un rango numérico. filtrar(df, entre(Distancia, 48, 52))
es.na() ¿Es un valor faltante? filtrar(df, is.na(FuelEconomy))

Tres hábitos previenen la mayoría de los errores de filter().

  • Utilice %in% en lugar de OR encadenado. filtro(df, DíaDeLaSemana %en% c(“Monday”, “viernes”)) es más corto y mucho más difícil de escribir mal que dos comparaciones == unidas por una barra vertical.
  • Nunca compruebe un valor faltante con ==. La expresión x == NA devuelve NA, no TRUE, por lo que la fila se descarta silenciosamente. En su lugar, utilice is.na(x).
  • Las comas significan Y. filter(df, a, b) es idéntico a filter(df, a & b), por lo que el ejemplo anterior de este tutorial funciona de ambas maneras.

El tubo OperaTor en dplyr

La creación de un conjunto de datos requiere muchas operaciones, como por ejemplo:

  • importador
  • la fusión de
  • seleccionar
  • filtración
  • y así

La biblioteca dplyr viene con un operador práctico, %>%, llamado tuboEsto hace que la manipulación de datos sea más limpia, rápida y menos propensa a errores.

Este operador es un código que ejecuta pasos sin guardar los pasos intermedios en el disco duro. Si volvemos al ejemplo anterior, podemos seleccionar las variables de interés y filtrarlas. Tenemos tres pasos:

  • Paso 1: Importar datos: Importar los datos del GPS
  • Paso 2: Seleccionar datos: Seleccione GoingTo y DayOfWeek
  • Paso 3: Filtrar datos: Regresar solo a Casa y Miércoles

Podemos usar la manera difícil de hacerlo:

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

Salida:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Esa no es una forma práctica de encadenar muchas operaciones. Cada resultado intermedio permanece en el entorno y los nombres rápidamente dejan de tener sentido.

En su lugar, utilice el operador de tubería %>%. Se nombra el marco de datos una sola vez al principio y todos los pasos se derivan de él.

Sintaxis básica de canalización

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: the last instruction does not need a trailing `%>%`, because nothing follows it
- Note: assigning the result to a new object is optional. Without it, the output prints in the console.

Puedes crear tu primera tubería siguiendo los pasos enumerados anteriormente.

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) %>% 

#Step 2
select(GoingTo, DayOfWeek) %>% 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

Salida:

## [1] TRUE

Los dos objetos son idénticos, por lo que la tubería produjo exactamente el mismo resultado en una única instrucción legible.

arreglar()

En la sección tutorial anterior, aprenderá a ordenar los valores con la función sort(). La biblioteca dplyr tiene su función de clasificación. Funciona a las mil maravillas con el oleoducto. El verbo organizar() puede reordenar una o varias filas, ya sea de forma ascendente (predeterminada) o descendente.

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

Podemos ordenar la distancia por destino.

# Sort by destination and distance
step_2_df <- step_1_df %>%
    arrange(GoingTo, Distance)
head(step_2_df)

Salida:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

Verbos dplyr en R: Guía rápida

La tabla que aparece a continuación enumera todos los verbos utilizados en este tutorial, junto con su sintaxis y el valor que devuelve cada llamada:

Verb Objetivo Code Explicación
vislumbrar comprobar la estructura de un df
glimpse(df)
Tiene el mismo propósito que str(), pero es más fácil de leer.
Seleccione() Seleccionar/excluir las variables
select(df, A, B ,C)
Seleccione las variables A, B y C
select(df, A:C)
Seleccione todas las variables de A a C
select(df, -C)
Excluir C
filtrar() Mantener las filas que coincidan con una o más condiciones.
filter(df, condition1)
Una condición
filter(df, condition1 & condition2)
Dos condiciones combinadas con Y
arreglar() Ordenar el conjunto de datos con una o varias variables
arrange(A)
Tipo ascendente de variable A
arrange(A, B)
Tipo ascendente de variables A y B
arrange(desc(A), B)
Tipo descendente de variable A y tipo ascendente de B
%>% Crear una canalización entre cada paso
step 1 %>% step 2 %>% step 3

Preguntas Frecuentes

El operador %>% de magrittr viene incluido con dplyr y admite sintaxis de marcador de posición con un punto. El operador nativo |> llegó en R 4.1 y no requiere paquete. Ambos pasan el resultado de la izquierda al primer argumento de la derecha.

No. Cada verbo de dplyr devuelve un nuevo marco de datos y deja la entrada original intacta. Para que el cambio persista, debes asignar el resultado a un objeto o redirigirlo a otro.

Una comparación con NA devuelve NA en lugar de TRUE, y filter() conserva solo las filas que son TRUE. Utilice is.na() para seleccionar deliberadamente los valores faltantes, o drop_na() de tidyr para eliminarlos.

La ingeniería de características para modelos de IA consiste principalmente en filtrar filas, seleccionar columnas y ordenar. dplyr expresa estos pasos como secuencias de comandos legibles que los revisores pueden auditar, lo cual es importante cuando un conjunto de datos de entrenamiento debe ser reproducible.

Sí. Los asistentes de IA pueden traducir la selección de subconjuntos entre corchetes a llamadas a select() y filter() y explicar el uso de tuberías. Siempre ejecute ambas versiones y compare las dimensiones, ya que R base y dplyr tratan los valores faltantes de manera diferente.

Resumir este post con: