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 |
