R Select(), Filter(), Arrange(), Cjevovod s primjerom
⚡ Pametni sažetak
Odaberi, filtriraj i rasporedi u R-u su tri dplyr glagola koja reduciraju podatkovni okvir na stupce, retke i redoslijed koji vam je potreban. Ovaj vodič ih povezuje s operatorom cijevi na skupu podataka o vremenima putovanja od 205 redaka.

Što je dplyr u R-u?
dplyr je paket za manipulaciju podacima tidyversea. Zamjenjuje notaciju baze u obliku zagrada R s malim skupom glagola, od kojih je svaki nazvan po radnji koju izvodi i svaki uzima podatkovni okvir kao svoj prvi argument. Taj dosljedan oblik omogućuje lančano povezivanje glagola.
| Glagol | Djeluje na | Ono što se također |
|---|---|---|
| Odaberi() | Kolumne | Zadržava ili briše varijable |
| filtar() | Redovi | Održava retke koji odgovaraju uvjetu |
| organizirati () | Redovi | Preuredi retke za jedan ili više stupaca |
| mutirati() | Kolumne | Stvara ili mijenja varijablu |
| rezimirati() | Cijeli stol | Sažima više redaka u jednu statistiku |
| grupiraj_po() | Cijeli stol | Dijeli podatke tako da se kasniji glagoli izvršavaju po grupi |
Ovaj vodič pokriva prva tri glagola plus okomitu crtu. tutorijal o agregatnim funkcijama Detaljno pokriva group_by() i summarize().
Skup podataka korišten u ovom vodiču
Biblioteka pod nazivom dplyr sadrži vrijedne glagole za navigaciju unutar skupa podataka. U ovom vodiču koristit ćete skup podataka o vremenima putovanja. Skup podataka bilježi putovanja koja vozač obavi između doma i radnog mjesta. U skupu podataka postoji četrnaest varijabli, 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 sadrži 205 opažanja, a vožnje su se odvijale od Monday do petka.
Prije svega, trebate:
- učitati skup podataka
- provjeriti strukturu podataka.
Jedna praktična dplyr funkcija je glimpse(). Igra istu ulogu kao i str() u osnovnom R-u, ali ispisuje jedan redak po varijabli s tipom i prvih nekoliko vrijednosti, što je puno lakše skenirati na širokom skupu podataka.
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...
Varijabla Komentari očito treba bliže pogledati: prva opažanja su sva prazna.
sum(df$Comments =="")
Code Objašnjenje
- sum(df$Comments == “”): Broji opažanja jednaka praznom nizu u stupcu Komentari od df
Izlaz:
## [1] 181
Nakon učitavanja podataka, počnite s glagolom koji skraćuje stupce.
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.
Pomoćne funkcije select() u R-u
Imenovanje svakog stupca postaje nepraktično kada skup podataka ima desetke varijabli. dplyr dolazi s pomoćnicima koji umjesto toga odabiru stupce prema uzorku ili prema vrsti.
| Pomagač | Odabire stupce koji | Primjer |
|---|---|---|
| počinje_s() | Započnite s nizom | odaberi(df, počinje_s(“Prosjek”)) |
| završava_s() | Završite nizom | odaberi(df, završava_s("Vrijeme")) |
| sadrži () | Sadrži niz znakova bilo gdje | odaberi(df, sadrži("Brzina")) |
| odgovara() | Pronađi regularni izraz | odaberi(df, podudaranja(“^Maks.|^Prosj.”)) |
| gdje() | Zadovoljiti tipski test | odaberi(df, gdje(je.broj)) |
| sve() | Još nisu imenovani | odaberi(df, UkupnoVrijeme, sve()) |
# 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())
Još dva glagola se prirodno sparuju s funkcijom select(). Koristite rename(new_name = old_name) za promjenu naziva stupca bez brisanja.ping ostale i relocate() za premještanje stupaca bez njihovog navođenja svih.
filtar()
Glagol filter() zadržava opažanja koja zadovoljavaju uvjet. filter() radi potpuno isto kao select(), prvo se prosljeđuje okvir podataka, 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)
Code Objašnjenje
- table(): Broji broj opažanja po razini. Očekuje faktor ili karakternu varijablu
- table(step_1_df$GoingTo): Prebroji broj putovanja prema svakom 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 where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Izlaz:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Izlaz:
## [1] 105 14
Više kriterija
Skup podataka možemo filtrirati s više kriterija. Na primjer, možetetracopažanja gdje je odredište Dom, a putovanje se dogodilo 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.
Uobičajeni uvjeti filtera() i Operatorovi u R
filter() zadržava svaki redak za koji se uvjet isplati kao TRUE. Redci koji se ispostave kao NA se odbacuju, što je ponašanje koje iznenađuje većinu početnika.
| Operahumka | Značenje | Primjer |
|---|---|---|
| == | Jednak | filter(df, GoingTo == “Početna”) |
| != | Nije jednako | filter(df, DanUTjednu != “Monday") |
| & | I, oboje mora vrijediti | filter(df, Udaljenost > 50 i Maks. Brzina > 130) |
| | | ILI, bilo koji od njih može vrijediti | filter(df, DanUTjednu == “Monday” | DanUTjednu == “Petak”) |
| %u% | Odgovara bilo kojoj vrijednosti u vektoru | filter(df, DanUTjednu %u% c("Monday", "Petak")) |
| između() | Spada unutar numeričkog raspona | filter(df, između(Udaljenost, 48, 52)) |
| je.na() | Nedostaje vrijednost | filter(df, is.na(PotrošnjaGoriva)) |
Tri navike sprječavaju većinu filter() grešaka.
- Koristite %in% umjesto lančanog ILI. filter(df, DanUTjednu %u% c("Monday", "Petak")) je kraće i puno ga je teže pogrešno napisati nego dvije usporedbe == spojene okomitom crtom.
- Nikada ne provjeravajte nedostajuću vrijednost pomoću ==. Izraz x == NA vraća NA, a ne TRUE, pa se redak tiho odbacuje. Umjesto toga koristite is.na(x).
- Zarezi znače I. filter(df, a, b) je identičan filter(df, a & b), zbog čega primjer ranije u ovom tutorijalu radi u oba slučaja.
Cijev Operator u dplyru
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 cijevČini manipulaciju podacima čišćom, bržom i manje sklonom pogreš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 lančanog povezivanja mnogih operacija. Svaki međurezultat ostaje u okruženju, a imena brzo prestaju značiti bilo što.
Umjesto toga koristite operator cijevi %>%. Okvir podataka imenujete jednom na početku i svaki korak teče od 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 a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints 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
Dva objekta su identična, pa je cijev proizvela potpuno isti rezultat u jednoj čitljivoj izjavi.
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
dplyr Glagoli u R-u: Kratki vodič
U donjoj tablici navedeni su svi glagoli korišteni u ovom vodiču, sa sintaksom i onim što svaki poziv vraća:
| Glagol | Cilj | Code | Objašnjenje |
|---|---|---|---|
| svjetlucanje | provjerite strukturu df-a |
glimpse(df)
|
Ista svrha kao str(), lakše za čitanje |
| 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() | Neka retci odgovaraju jednom ili više uvjeta |
filter(df, condition1)
|
Jedan uvjet |
filter(df, condition1 & condition2)
|
Dva uvjeta kombinirana s I | ||
| 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 |
