R Select(), Filter(), Arrange(), Cjevovod s primjerom

Knjižnica pod nazivom dplyr sadrži vrijedne glagole za navigaciju unutar skupa podataka. Kroz ovaj vodič koristit ćete skup podataka o vremenu putovanja. Skup podataka prikuplja informacije o putovanju koje vodi vozač između svog doma i radnog mjesta. Postoji četrnaest varijabli u skupu podataka, uključujući:

  • DayOfWeek: Identificirajte dan u tjednu kada vozač koristi svoj automobil
  • Udaljenost: Ukupna udaljenost putovanja
  • MaxSpeed: Maksimalna brzina putovanja
  • Ukupno vrijeme: Duljina putovanja u minutama

Skup podataka ima oko 200 opažanja u skupu podataka, a vožnje su se dogodile između Monday do petka.

Prije svega, trebate:

  • učitati skup podataka
  • provjeriti strukturu podataka.

Jedna korisna značajka s dplyr je funkcija glimpse(). Ovo je poboljšanje u odnosu na str(). Možemo koristiti glimpse() da vidimo strukturu skupa podataka i odlučimo koja je manipulacija potrebna.

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

Izlaz:

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

Očito je da varijabla Komentari treba dodatnu dijagnostiku. Prva opažanja varijable Komentari samo nedostaju vrijednosti.

sum(df$Comments =="")

Objašnjenje koda

  • sum(df$Comments ==””): Zbroj opažanja jednaka “” u komentarima stupca od df

Izlaz:

## [1] 181

Odaberi()

Počet ćemo s glagolom select(). Ne trebaju nam nužno sve varijable, a dobra je praksa odabrati samo one varijable koje smatrate relevantnima.

Nedostaje nam 181 promatranje, gotovo 90 posto skupa podataka. Ako ih odlučite isključiti, nećete moći nastaviti analizu.

Druga mogućnost je ispuštanje varijable Comment s glagolom select().

Varijable možemo odabrati na različite načine pomoću select(). Imajte na umu da je prvi argument skup podataka.

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

Možete koristiti treći način da isključite varijablu Comments.

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

Izlaz:

## [1] 205  14
dim(step_1_df)

Izlaz:

## [1] 205  13

Izvorni skup podataka ima 14 značajki dok step_1_df ima 13.

Filtar()

Glagol filter() pomaže da zapažanja slijede kriterij. Filter() radi točno kao select(), prvo prosljeđujete podatkovni okvir, a zatim uvjet odvojen zarezom:

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

Jedan kriterij

Prije svega, možete prebrojati broj opažanja unutar svake razine faktorske varijable.

table(step_1_df$GoingTo)

Objašnjenje koda

  • table(): Izbrojite broj opažanja po razini. Napomena, prihvaćaju se samo varijable razine faktora
  • table(step_1_df$GoingTo): Izbrojite broj putovanja prema konačnom odredištu.

Izlaz:

## 
##  GSK Home 
##  105  100	

Funkcijska tablica() pokazuje da 105 vožnji ide do GSK-a, a 100 do kuće.

Možemo filtrirati podatke kako bismo vratili jedan skup podataka sa 105 opažanja i drugi sa 100 opažanja.

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

Izlaz:

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

Izlaz:

## [1] 105  14

Višestruki kriteriji

Možemo filtrirati skup podataka s više od jednog kriterija. Na primjer, možete izdvojiti opažanja gdje je odredište Dom i dogodilo se u srijedu.

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

Izlaz:

## [1] 23 14

23 opažanja odgovaraju ovom kriteriju.

Cjevovod

Stvaranje skupa podataka zahtijeva mnogo operacija, kao što su:

  • uvoza
  • stapanje
  • Odabirom
  • filtriranje
  • i tako dalje

Knjižnica dplyr dolazi s praktičnim operatorom, %>%, koji se zove the cjevovod. Značajka cjevovoda čini manipulaciju čistom, brzom i manje podložnom greškama.

Ovaj operator je kod koji izvodi korake bez spremanja međukoraka na tvrdi disk. Ako se vratite na naš primjer odozgo, možete odabrati varijable od interesa i filtrirati ih. Imamo tri koraka:

  • Korak 1: Uvezite podatke: Uvezite GPS podatke
  • Korak 2: Odaberite podatke: Odaberite GoingTo i DayOfWeek
  • Korak 3: Filtrirajte podatke: Povratak samo kući i srijedom

Možemo koristiti teži način da to učinimo:

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

Izlaz:

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

To nije prikladan način za izvođenje mnogih operacija, posebno u situaciji s puno koraka. Okolina završava s mnogo pohranjenih predmeta.

Umjesto toga upotrijebimo operator cjevovoda %>%. Trebamo samo definirati okvir podataka koji se koristi na početku i sav proces će teći iz njega.

Osnovna sintaksa cjevovoda

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.

Svoju prvu cijev možete izraditi slijedeći gore navedene korake.

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

Izlaz:

## [1] TRUE

Spremni smo stvoriti zadivljujući skup podataka s operaterom cjevovoda.

organizirati ()

u prethodni vodičnaučit ćete kako sortirati vrijednosti pomoću funkcije sort(). Knjižnica dplyr ima svoju funkciju sortiranja. To radi kao šarm s cjevovodom. Glagol arrange() može promijeniti redoslijed jednog ili više redaka, bilo uzlazno (zadano) ili silazeći.

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

Udaljenost možemo sortirati prema odredištu.

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

Izlaz:

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

rezime

U donjoj tablici sažimate sve operacije koje ste naučili tijekom poduke.

Glagol Cilj Kodirati Objašnjenje
svjetlucanje provjerite strukturu df-a
glimpse(df)
Identično str()
Odaberi() Odaberite/isključite varijable
select(df, A, B ,C)
Odaberite varijable A, B i C
select(df, A:C)
Odaberite sve varijable od A do C
select(df, -C)
Isključi C
filtar() Filtrirajte df na temelju jednog ili više uvjeta
filter(df, condition1)
Jedan uvjet
filter(df, condition1
uvjet2)
organizirati () Razvrstajte skup podataka s jednom ili više varijabli
arrange(A)
Uzlazno sortiranje varijable A
arrange(A, B)
Uzlazno sortiranje varijabli A i B
arrange(desc(A), B)
Silazno sortiranje varijable A i rastuće sortiranje B
%>% Napravite cjevovod između svakog koraka
step 1 %>% step 2 %>% step 3