R Select(), Filter(), Arrange(), Pipeline with Example
โก Chytrรฉ shrnutรญ
Select, Filter a Arrange v R jsou tลi pลรญkazy dplyr, kterรฉ redukujรญ datovรฝ rรกmec na potลebnรฉ sloupce, ลรกdky a poลadรญ. Tento nรกvod je zลetฤzรญ s operรกtorem pipe na datovรฉ sadฤ o dobรกch cestovรกnรญ s 205 ลรกdky.

Co je dplyr v R?
dplyr je balรญฤek pro manipulaci s daty v tidyverse. Nahrazuje zรกvorkovou notaci zรกkladu R s malou sadou sloves, z nichลพ kaลพdรฉ je pojmenovรกno podle akce, kterou provรกdรญ, a kaลพdรฉ bere datovรฝ rรกmec jako svลฏj prvnรญ argument. Tento konzistentnรญ tvar umoลพลuje ลetฤzenรญ sloves.
| Sloveso | Pลฏsobรญ na | Co to dฤlรก |
|---|---|---|
| vybrat() | Sloupce | Zachovรกvรก nebo odstraลuje promฤnnรฉ |
| filtr() | ลรกdky | Udrลพuje ลรกdky odpovรญdajรญcรญ podmรญnce |
| uspoลรกdat() | ลรกdky | Zmฤnรญ poลadรญ ลรกdkลฏ o jeden nebo vรญce sloupcลฏ |
| mutovat() | Sloupce | Vytvoลรญ nebo upravรญ promฤnnou |
| shrnout() | Celรฝ stลฏl | Sbalรญ vรญce ลรกdkลฏ do jednรฉ statistiky |
| seskupovat_podle() | Celรฝ stลฏl | Rozdฤlรญ data tak, aby pozdฤjลกรญ slovesa bฤลพela v jednotlivรฝch skupinรกch. |
Tento tutoriรกl se zabรฝvรก prvnรญmi tลemi slovesy a svislou ฤรกrkou. tutoriรกl k agregaฤnรญ funkci Podrobnฤ se zabรฝvรก metodami group_by() a summarize().
Datovรก sada pouลพitรก v tomto tutoriรกlu
Knihovna s nรกzvem dplyr obsahuje cennรฉ slovesa pro navigaci v datovรฉ sadฤ. V tomto tutoriรกlu se seznรกmรญte s datovou sadou Travel times (doby cestovรกnรญ). Datovรก sada zaznamenรกvรก cesty, kterรฉ ลidiฤ podnikne mezi domovem a pracoviลกtฤm. V datovรฉ sadฤ je ฤtrnรกct promฤnnรฝch, vฤetnฤ:
- DayOfWeek: Urฤete den v tรฝdnu, kdy ลidiฤ pouลพรญvรก svรฉ auto
- Vzdรกlenost: Celkovรก vzdรกlenost cesty
- MaxSpeed: Maximรกlnรญ rychlost jรญzdy
- TotalTime: Dรฉlka cesty v minutรกch
Soubor dat obsahuje 205 pozorovรกnรญ a jรญzdy se uskuteฤnily od Monday do pรกtku.
Nejprve musรญte:
- naฤรญst datovou sadu
- zkontrolujte strukturu dat.
Jednou z praktickรฝch funkcรญ v dplyru je glimpse(). Hraje stejnou roli jako str() v zรกkladnรญm R, ale vypisuje jeden ลรกdek na promฤnnou s typem a prvnรญmi nฤkolika hodnotami, coลพ je mnohem snazลกรญ prohledรกvat na ลกirokรฉ datovรฉ sadฤ.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Vรฝstup:
## 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...
Promฤnnรก Comments si zjevnฤ vyลพaduje bliลพลกรญ pohled: prvnรญ pozorovรกnรญ jsou vลกechna prรกzdnรก.
sum(df$Comments =="")
Code Vysvฤtlenรญ
- sum(df$Comments == โโ): Poฤรญtรก pozorovรกnรญ rovnajรญcรญ se prรกzdnรฉmu ลetฤzci ve sloupci Komentรกลe funkce df
Vรฝstup:
## [1] 181
Po naฤtenรญ dat zaฤnฤte s pลรญkazem, kterรฝ oลezรกvรก sloupce.
vybrat()
Zaฤneme slovesem select(). Nepotลebujeme nutnฤ vลกechny promฤnnรฉ a osvฤdฤenรฝm postupem je vybrat pouze ty promฤnnรฉ, kterรฉ povaลพujete za relevantnรญ.
Mรกme 181 chybฤjรญcรญch pozorovรกnรญ, tรฉmฤล 90 procent datovรฉho souboru. Pokud se je rozhodnete vylouฤit, nebudete moci v analรฝze pokraฤovat.
Dalลกรญ moลพnostรญ je vypustit promฤnnou Komentรกล se slovesem select().
Pomocรญ select() mลฏลพeme vybรญrat promฤnnรฉ rลฏznรฝmi zpลฏsoby. Vลกimnฤte si, ลพe prvnรญm argumentem je datovรก sada.
- `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.
K vylouฤenรญ promฤnnรฉ Komentรกลe mลฏลพete pouลพรญt tลetรญ zpลฏsob.
step_1_df <- select(df, -Comments) dim(df)
Vรฝstup:
## [1] 205 14
dim(step_1_df)
Vรฝstup:
## [1] 205 13
Pลฏvodnรญ datovรก sada mรก 14 funkcรญ, zatรญmco step_1_df mรก 13.
Pomocnรฉ funkce select() v R
Pojmenovรกnรญ kaลพdรฉho sloupce se stรกvรก nepraktickรฝm, jakmile datovรก sada obsahuje desรญtky promฤnnรฝch. dplyr je dodรกvรกn s pomocnรญky, kterรฉ mรญsto toho vybรญrajรญ sloupce podle vzoru nebo podle typu.
| Pomocnรญk | Vybere sloupce, kterรฉ | Pลรญklad |
|---|---|---|
| zaฤรญnรก_s() | Zaฤnฤte ลetฤzcem | select(df, starts_with(โPrลฏmฤrโ)) |
| konฤรญ_s() | Ukonฤete provรกzkem | vybrat(df, konฤรญ_s(โฤasโ)) |
| obsahuje() | Obsahovat ลetฤzec kdekoli | select(df, contains(โRychlostโ)) |
| zรกpasy() | Hledรกnรญ regulรกrnรญho vรฝrazu | select(df, matches(โ^Max|^Prลฏmฤrโ)) |
| kde() | Splลte poลพadavky typovรฉ zkouลกky | vybrat(df, kde(je.ฤรญselnรฝ)) |
| vลกechno() | Zatรญm nebyli jmenovรกni | vybrat(df, Celkovรฝฤas, vลกechno()) |
# 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())
S funkcรญ select() se pลirozenฤ pรกrujรญ dalลกรญ dvฤ slovesa. Pro zmฤnu nรกzvu sloupce bez jeho odstranฤnรญ pouลพijte rename(new_name = old_name).ping ostatnรญ a relocate() pro pลesun sloupcลฏ bez jejich vรฝpisu vลกech.
filtr()
Sloveso filter() uchovรกvรก pozorovรกnรญ, kterรก splลujรญ podmรญnku. Filter() funguje pลesnฤ jako select(), nejprve se pลedรก datovรฝ rรกmec a potรฉ podmรญnka oddฤlenรก ฤรกrkou:
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Jedno kritรฉrium
Nejprve mลฏลพete spoฤรญtat poฤet pozorovรกnรญ v rรกmci kaลพdรฉ รบrovnฤ faktorovรฉ promฤnnรฉ.
table(step_1_df$GoingTo)
Code Vysvฤtlenรญ
- table(): Spoฤรญtรก poฤet pozorovรกnรญ na รบroveล. Oฤekรกvรก faktor nebo znakovou promฤnnou.
- table(step_1_df$GoingTo): Spoฤรญtejte poฤet cest smฤrem ke kaลพdรฉmu cรญli
Vรฝstup:
## ## GSK Home ## 105 100
Funkฤnรญ tabulka() udรกvรก, ลพe 105 jรญzd smฤลuje do GSK a 100 do Home.
Data mลฏลพeme filtrovat, abychom vrรกtili jednu datovou sadu se 105 pozorovรกnรญmi a druhou se 100 pozorovรกnรญmi.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Vรฝstup:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Vรฝstup:
## [1] 105 14
Vรญce kritรฉriรญ
Datovou sadu mลฏลพeme filtrovat podle vรญce neลพ jednoho kritรฉria. Mลฏลพete napลรญklad extracpozorovรกnรญ, kde cรญlem je Domov a cesta se uskuteฤnila ve stลedu.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Vรฝstup:
## [1] 23 14
Tomuto kritรฉriu odpovรญdalo 23 pozorovรกnรญ.
Bฤลพnรฉ podmรญnky filtru() a Operatory v R
Funkce filter() uchovรกvรก vลกechny ลรกdky, pro kterรฉ je podmรญnka vyhodnocena jako TRUE. ลรกdky, kterรฉ jsou vyhodnoceny jako NA, jsou vynechรกny, coลพ je chovรกnรญ, kterรฉ pลekvapuje vฤtลกinu zaฤรกteฤnรญkลฏ.
| OperaTor | Vรฝznam | Pลรญklad |
|---|---|---|
| == | Rovnรก | filter(df, GoingTo == โDomลฏโ) |
| != | Nerovnรก se | filter(df, DenVTรฝdnu != โMonday") |
| & | A obฤ musรญ platit | filtr(df, Vzdรกlenost > 50 a Max. Rychlost > 130) |
| | | NEBO, mลฏลพe platit kterรฝkoli z nich | filtr(df, DenVTรฝdnu == โMondayโ| DenVTรฝdnu == โPรกtekโ) |
| %v% | Odpovรญdรก jakรฉkoli hodnotฤ ve vektoru | filter(df, DenVTรฝdnu %v% c(โMondayโPรกtekโ)) |
| mezi() | Spadรก do ฤรญselnรฉho rozsahu | filter(df, mezi(Vzdรกlenost, 48, 52)) |
| is.na() | Chybฤjรญcรญ hodnota | filter(df, is.na(SpotลebaPaliva)) |
Vฤtลกinฤ chyb funkce filter() zabraลujรญ tลi nรกvyky.
- Pouลพijte %in% mรญsto zลetฤzenรฉho operรกtoru OR. filter(df, DenVTรฝdnu %v% c(โMondayโpรกtekโ)) je kratลกรญ a mnohem tฤลพลกรญ se u nฤj pลeklepnout neลพ u dvou porovnรกnรญ == spojenรฝch svislou ฤรกrou.
- Nikdy netestujte chybฤjรญcรญ hodnotu pomocรญ ==. Vรฝraz x == NA vracรญ NA, nikoli TRUE, takลพe ลรกdek je tiลกe odstranฤn. Pouลพijte mรญsto toho is.na(x).
- ฤรกrky znamenajรญ A. Funkce filter(df, a, b) je identickรก s funkcรญ filter(df, a & b), a proto pลรญklad v tomto tutoriรกlu funguje obฤma zpลฏsoby.
Potrubรญ Operator v dplyru
Vytvoลenรญ datovรฉ sady vyลพaduje mnoho operacรญ, jako napลรญklad:
- importu
- sluฤovรกnรญ
- vรฝbฤr
- filtrovรกnรญ
- a tak dรกle
Knihovna dplyr pลichรกzรญ s praktickรฝm operรกtorem %>%, zvanรฝm dรฝmkouDรญky tomu je manipulace s daty ฤistลกรญ, rychlejลกรญ a mรฉnฤ nรกchylnรก k chybรกm.
Tento operรกtor je kรณd, kterรฝ provรกdรญ kroky bez uklรกdรกnรญ mezikrokลฏ na pevnรฝ disk. Pokud se vrรกtรญte k naลกemu pลรญkladu vรฝลกe, mลฏลพete vybrat promฤnnรฉ, kterรฉ vรกs zajรญmajรญ, a filtrovat je. Mรกme tลi kroky:
- Krok 1: Import dat: Importujte data gps
- Krok 2: Vyberte data: Vyberte GoingTo a DayOfWeek
- Krok 3: Filtrovรกnรญ dat: Nรกvrat pouze Domลฏ a Stลeda
Mลฏลพeme k tomu pouลพรญt obtรญลพnรฝ zpลฏsob:
# 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)
Vรฝstup:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
To nenรญ pohodlnรฝ zpลฏsob, jak ลetฤzit mnoho operacรญ. Kaลพdรฝ mezivรฝsledek zลฏstรกvรก v prostลedรญ a nรกzvy rychle pลestรกvajรญ mรญt ลพรกdnรฝ vรฝznam.
Pouลพijte mรญsto toho operรกtor svisle %>%. Datovรฝ rรกmec pojmenujete jednou na zaฤรกtku a kaลพdรฝ krok vychรกzรญ z nฤj.
Zรกkladnรญ syntaxe potrubรญ
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.
Svou prvnรญ rouru mลฏลพete vytvoลit podle vรฝลกe uvedenรฝch krokลฏ.
# 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)
Vรฝstup:
## [1] TRUE
Oba objekty jsou identickรฉ, takลพe roura v jednom ฤitelnรฉm pลรญkazu vytvoลila pลesnฤ stejnรฝ vรฝsledek.
uspoลรกdat()
v pลedchozรญ tutoriรกl, nauฤรญte se tลรญdit hodnoty pomocรญ funkce sort(). Knihovna dplyr mรก svou tลรญdicรญ funkci. S potrubรญm to funguje jako kouzlo. Sloveso uspoลรกdat() mลฏลพe zmฤnit poลadรญ jednoho nebo mnoha ลรกdkลฏ, buฤ vzestupnฤ (vรฝchozรญ) nebo sestupnฤ.
- `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
Vzdรกlenost mลฏลพeme seลadit podle mรญsta urฤenรญ.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Vรฝstup:
## 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
Slovesa dplyr v R: Struฤnรฝ pลehled
V nรกsledujรญcรญ tabulce jsou uvedena vลกechna slovesa pouลพitรก v tomto tutoriรกlu, vฤetnฤ syntaxe a toho, co kaลพdรฉ volรกnรญ vracรญ:
| Sloveso | Objektivnรญ | Code | Vysvฤtlenรญ |
|---|---|---|---|
| zรกblesk | zkontrolujte strukturu df |
glimpse(df)
|
Stejnรฝ รบฤel jako str(), snรกze ฤitelnรฝ |
| vybrat() | Vybrat/vylouฤit promฤnnรฉ |
select(df, A, B ,C)
|
Vyberte promฤnnรฉ A, B a C |
select(df, A:C)
|
Vyberte vลกechny promฤnnรฉ od A do C | ||
select(df, -C)
|
Vylouฤit C | ||
| filtr() | Zachovat ลรกdky odpovรญdajรญcรญ jednรฉ nebo vรญce podmรญnkรกm |
filter(df, condition1)
|
Jedna podmรญnka |
filter(df, condition1 & condition2)
|
Dvฤ podmรญnky kombinovanรฉ s AND | ||
| uspoลรกdat() | Seลaฤte datovou sadu podle jednรฉ nebo vรญce promฤnnรฝch |
arrange(A)
|
Vzestupnรฝ druh promฤnnรฉ A |
arrange(A, B)
|
Vzestupnรฝ druh promฤnnรฉ A a B | ||
arrange(desc(A), B)
|
Sestupnรฝ druh promฤnnรฉ A a vzestupnรฝ druh B | ||
| %>% | Mezi jednotlivรฝmi kroky vytvoลte potrubรญ |
step 1 %>% step 2 %>% step 3 |
