R Seleccionar(), Filtro(), Organizar(), Canalización con ejemplo
La biblioteca llamada dplyr contiene verbos valiosos para navegar dentro del conjunto de datos. A través de este tutorial, utilizará el conjunto de datos de Tiempos de viaje. El conjunto de datos recopila información sobre el viaje realizado por un conductor entre su casa y su lugar de trabajo. Hay catorce variables en el conjunto de datos, que incluyen:
- 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 tiene alrededor de 200 observaciones y los viajes ocurrieron entre Monday para el viernes.
En primer lugar, necesitas:
- cargar el conjunto de datos
- comprobar la estructura de los datos.
Una característica útil de dplyr es la función glimpse(). Esta es una mejora con respecto a str(). Podemos usar glimpse() para ver la estructura del conjunto de datos y decidir qué manipulación se requiere.
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...
Es obvio que la variable Comentarios necesita un diagnóstico adicional. Las primeras observaciones de la variable Comentarios son solo valores faltantes.
sum(df$Comments =="")
Explicación del código
- sum(df$Comments ==””): La suma de las observaciones equivale a “” en la columna de comentarios de df
Salida:
## [1] 181
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.
Filtrar()
El verbo filter() ayuda a mantener las observaciones según un criterio. El filter() funciona exactamente como 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)
Explicación del código
- table(): Cuenta el número de observaciones por nivel. Nota: solo se aceptan variables de nivel de factor
- table(step_1_df$GoingTo): Cuente el número de viajes hacia el destino final.
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 if GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Salida:
## [1] 100 14
# Select observations if GoingTo == Work select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Salida:
## [1] 105 14
Múltiples criterios
Podemos filtrar un conjunto de datos con más de un criterio. Por ejemplo, puede extraer las observaciones donde el destino es Inicio y 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.
Tubería
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 industrial. La función de canalización hace que la manipulación sea 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
No es una forma cómoda de realizar muchas operaciones, especialmente en una situación con muchos pasos. El entorno termina con muchos objetos almacenados.
En su lugar, utilizaremos el operador de canalización %>%. Solo necesitamos definir el marco de datos utilizado al principio y todo el proceso fluirá a partir 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 the pipe operator `%`, you don't have instructions to pipe anymore Note: Create a new variable is optional. If not included, the output will be displayed 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
Estamos listos para crear un conjunto de datos sorprendente con el operador del oleoducto.
arreglar()
En Los 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
Resum
En la siguiente tabla, resume todas las operaciones que aprendió durante el tutorial.
Verb | Objetivo | Código | Explicación |
---|---|---|---|
vislumbrar | comprobar la estructura de un df |
glimpse(df) |
Idéntico a str() |
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() | Filtrar el df según una o varias condiciones |
filter(df, condition1) |
Una condición |
filter(df, condition1 |
condición2) | ||
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 |