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.
¿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 |

