R Selectare(), Filtru (), Aranjare(), Pipeline cu Exemplu

Biblioteca numită dplyr conține verbe valoroase pentru a naviga în interiorul setului de date. Prin acest tutorial, veți folosi setul de date Timp de călătorie. Setul de date colectează informații despre călătoria efectuată de un șofer între locuință și locul de muncă. Există paisprezece variabile în setul de date, inclusiv:

  • DayOfWeek: identificați ziua din săptămână în care șoferul își folosește mașina
  • Distanță: distanța totală a călătoriei
  • MaxSpeed: Viteza maximă a călătoriei
  • TotalTime: lungimea în minute a călătoriei

Setul de date are aproximativ 200 de observații în setul de date, iar călătoriile au avut loc între Monday până vineri.

În primul rând, trebuie să:

  • încărcați setul de date
  • verifica structura datelor.

O caracteristică utilă cu dplyr este funcția glimpse(). Aceasta este o îmbunătățire față de str(). Putem folosi glimpse() pentru a vedea structura setului de date și pentru a decide ce manipulare este necesară.

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

ieșire:

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

Acest lucru este evident că variabila Comentarii necesită un diagnostic suplimentar. Primele observații ale variabilei Comentarii sunt doar valori lipsă.

sum(df$Comments =="")

Explicarea codului

  • sum(df$Comments ==””): Suma observațiile este egală cu „” în coloana comentarii din df

ieșire:

## [1] 181

Selectați()

Vom începe cu verbul select(). Nu avem neapărat nevoie de toate variabilele, iar o bună practică este să selectați doar variabilele pe care le considerați relevante.

Avem 181 de observații lipsă, aproape 90 la sută din setul de date. Dacă decideți să le excludeți, nu veți putea continua analiza.

Cealaltă posibilitate este să renunți la variabila Comentariu cu verbul select().

Putem selecta variabile în moduri diferite cu select(). Rețineți că primul argument este setul de date.

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

Puteți utiliza a treia modalitate de a exclude variabila Comentarii.

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

ieșire:

## [1] 205  14
dim(step_1_df)

ieșire:

## [1] 205  13

Setul de date original are 14 caracteristici, în timp ce step_1_df are 13.

Filtru()

Verbul filter() ajută la păstrarea observațiilor după un criteriu. Filter() funcționează exact ca select(), treci mai întâi cadrul de date și apoi o condiție separată prin virgulă:

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

Un singur criteriu

În primul rând, puteți număra numărul de observații din fiecare nivel al unei variabile factor.

table(step_1_df$GoingTo)

Explicarea codului

  • table(): numărați numărul de observații pe nivel. Rețineți că sunt acceptate doar variabilele la nivel de factor
  • table(step_1_df$GoingTo): numărați numărul de călătorii către destinația finală.

ieșire:

## 
##  GSK Home 
##  105  100	

Tabelul de funcții() indică 105 curse către GSK și 100 către Acasă.

Putem filtra datele pentru a returna un set de date cu 105 de observații și altul cu 100 de observații.

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

ieșire:

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

ieșire:

## [1] 105  14

Criterii multiple

Putem filtra un set de date cu mai multe criterii. De exemplu, puteți extrage observațiile unde destinația este Acasă și a avut loc într-o zi de miercuri.

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

ieșire:

## [1] 23 14

23 de observații corespund acestui criteriu.

Conductă

Crearea unui set de date necesită o mulțime de operațiuni, cum ar fi:

  • importatoare
  • care fuzionează
  • selectarea
  • filtrare
  • și așa mai departe

Biblioteca dplyr vine cu un operator practic, %>%, numit conducte. Caracteristica pipeline face ca manipularea să fie curată, rapidă și mai puțin promptă la eroare.

Acest operator este un cod care efectuează pași fără a salva pașii intermediari pe hard disk. Dacă reveniți la exemplul nostru de mai sus, puteți selecta variabilele de interes și le puteți filtra. Avem trei pași:

  • Pasul 1: importați date: importați datele GPS
  • Pasul 2: Selectați datele: selectați GoingTo și DayOfWeek
  • Pasul 3: Filtrați datele: Reveniți numai acasă și miercuri

Putem folosi modul greu de a face acest lucru:

# 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)

ieșire:

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

Acesta nu este o modalitate convenabilă de a efectua multe operații, mai ales într-o situație cu mulți pași. Mediul se termină cu o mulțime de obiecte stocate.

Să folosim în schimb operatorul pipeline %>%. Trebuie doar să definim cadrul de date folosit la început și tot procesul va decurge din acesta.

Sintaxa de bază a conductei

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.

Puteți crea prima conductă urmând pașii enumerați mai sus.

# 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)

ieșire:

## [1] TRUE

Suntem gata să creăm un set de date uimitor cu operatorul conductei.

aranja()

În tutorialul anterior, înveți cum să sortezi valorile cu funcția sort(). Biblioteca dplyr are funcția de sortare. Funcționează ca un farmec cu conducta. Verbul arrange() poate reordona unul sau mai multe rânduri, fie crescător (implicit), fie descrescător.

- `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

Putem sorta distanța după destinație.

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

ieșire:

##     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

Rezumat

În tabelul de mai jos, rezumați toate operațiunile pe care le-ați învățat în timpul tutorialului.

Verb Obiectiv Cod Explicație
licărire verifica structura unui df
glimpse(df)
Identic cu str()
Selectați() Selectați/excludeți variabilele
select(df, A, B ,C)
Selectați variabilele A, B și C
select(df, A:C)
Selectați toate variabilele de la A la C
select(df, -C)
Excludeți C
filtru() Filtrați df în funcție de una sau mai multe condiții
filter(df, condition1)
O condiție
filter(df, condition1
condiție 2)
aranja() Sortați setul de date cu una sau mai multe variabile
arrange(A)
Sort crescător de variabilă A
arrange(A, B)
Sort crescător de variabile A și B
arrange(desc(A), B)
Variabila descendentă A și ascendentă B
%>% Creați o conductă între fiecare pas
step 1 %>% step 2 %>% step 3