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