R Select(), Filter(), Järjestä(), Pipeline esimerkin kanssa
⚡ Älykäs yhteenveto
R:n valinta-, suodatus- ja järjestelyverbit ovat kolme dplyr-verbiä, jotka supistavat datakehyksen tarvitsemiisi sarakkeisiin, riveihin ja järjestykseen. Tässä ohjeessa ketjutetaan ne pipe-operaattorilla 205-rivisessä matka-aikoja mittaavassa datajoukossa.

Mikä on dplyr R:ssä?
dplyr on tidyversen datankäsittelypaketti. Se korvaa base-funktion sulkumerkinnän. R pienellä joukolla verbejä, joista jokainen on nimetty suorittamansa toiminnon mukaan ja jokainen ottaa datakehyksen ensimmäisenä argumenttinaan. Tämä yhdenmukainen muoto mahdollistaa verbien ketjuttamisen yhteen.
| Verbi | Toimii | Mitä se tekee |
|---|---|---|
| valitse () | Pylväät | Säilyttää tai poistaa muuttujat |
| suodattaa() | Rivit | Pitää rivit ehdon mukaisina |
| järjestää() | Rivit | Järjestää rivit uudelleen yhden tai useamman sarakkeen mukaan |
| muuttua() | Pylväät | Luo tai muokkaa muuttujaa |
| yhteenveto() | Koko pöytä | Yhdistää useita rivejä yhdeksi tilastoksi |
| ryhmittelyn_perusteella() | Koko pöytä | Jakaa tiedot niin, että myöhemmät verbit suoritetaan ryhmässä |
Tämä tutoriaali kattaa kolme ensimmäistä verbiä sekä piipun. koostefunktion opetusohjelma käsittelee group_by()- ja summarize()-funktioita perusteellisesti.
Tässä opetusohjelmassa käytetty tietojoukko
Kirjasto nimeltä dplyr sisältää arvokkaita verbejä datasetin sisällä navigointiin. Tässä opetusohjelmassa käytät matka-aikojen datasetiä. Datasetti tallentaa kuljettajan kodin ja työpaikan välillä tekemät matkat. Datasetissä on neljätoista muuttujaa, mukaan lukien:
- DayOfWeek: Tunnista viikonpäivä, jolloin kuljettaja käyttää autoaan
- Etäisyys: Matkan kokonaispituus
- MaxSpeed: Matkan suurin nopeus
- TotalTime: Matkan pituus minuutteina
Aineisto sisältää 205 havaintoa, ja ajelut tapahtuivat Monday perjantaihin.
Ensinnäkin sinun on:
- lataa tietojoukko
- tarkista datan rakenne.
Yksi kätevä dplyr-funktio on glimpse(). Se toimii samalla tavalla kuin R-perusfunktio str(), mutta tulostaa yhden rivin muuttujaa kohden tyypin ja muutaman ensimmäisen arvon kera, mikä on paljon helpompi skannata laajalla tietojoukolla.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
lähtö:
## 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...
Kommentit-muuttuja kaipaa selvästi tarkempaa tarkastelua: ensimmäiset havainnot ovat kaikki tyhjiä.
sum(df$Comments =="")
Code Selitys
- sum(df$Comments == “”): Laskee havainnot, jotka ovat yhtä kuin tyhjä merkkijono df-taulukon Kommentit-sarakkeessa
lähtö:
## [1] 181
Kun tiedot on ladattu, aloita verbillä, joka leikkaa sarakkeet.
valitse ()
Aloitamme verbillä select(). Emme välttämättä tarvitse kaikkia muuttujia, ja hyvä käytäntö on valita vain ne muuttujat, jotka pidät merkityksellisinä.
Meillä on 181 puuttuvaa havaintoa, lähes 90 prosenttia tietojoukosta. Jos päätät jättää ne pois, et voi jatkaa analyysiä.
Toinen mahdollisuus on pudottaa muuttuja Kommentti verbillä select().
Voimme valita muuttujia eri tavoilla select(). Huomaa, että ensimmäinen argumentti on tietojoukko.
- `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.
Voit käyttää kolmatta tapaa sulkea pois Kommentit-muuttuja.
step_1_df <- select(df, -Comments) dim(df)
lähtö:
## [1] 205 14
dim(step_1_df)
lähtö:
## [1] 205 13
Alkuperäisessä tietojoukossa on 14 ominaisuutta, kun taas step_1_df:ssä on 13.
select()-apufunktiot R:ssä
Jokaisen sarakkeen nimeäminen muuttuu epäkäytännölliseksi, kun tietojoukossa on kymmeniä muuttujia. dplyr toimitetaan apufunktioilla, jotka valitsevat sarakkeet kuvion tai tyypin mukaan.
| Auttaja | Valitsee sarakkeet, jotka | esimerkki |
|---|---|---|
| alkaa_käskyllä() | Aloita merkkijonolla | select(df, alkaa_with(“Keskiarvo”)) |
| päättyy_kanssa() | Lopeta merkkijonoon | select(df, ends_with(“Aika”)) |
| sisältää() | Sisältää merkkijonon missä tahansa | select(df, sisältää(“Nopeus”)) |
| Ottelut() | Säännöllisen lausekkeen vastaavuus | select(df, matches(“^Max|^Avg”)) |
| jossa() | Täytä tyyppitesti | select(df, where(is.numeerinen)) |
| kaikki() | Ei ole vielä nimetty | select(df, KokonaisAika, kaikki()) |
# 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())
Kaksi muuta verbiä pariutuu luonnollisesti select()-funktion kanssa. Käytä rename(new_name = old_name) -funktiota nimetäksesi sarakkeen uudelleen ilman pudotusta.ping muut ja relocate() siirtääksesi sarakkeita listaamatta niitä kaikkia.
suodattaa()
Filter()-verbi säilyttää havainnot, jotka täyttävät ehdon. Filter() toimii täsmälleen kuten select(), ensin välitetään datakehys ja sitten pilkulla erotettu ehto:
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Yksi kriteeri
Ensinnäkin voit laskea havaintojen lukumäärän tekijämuuttujan kullakin tasolla.
table(step_1_df$GoingTo)
Code Selitys
- table(): Laskee havaintojen määrän tasoa kohden. Se odottaa tekijä- tai merkkimuuttujaa.
- table(step_1_df$GoingTo): Laske matkojen lukumäärä kuhunkin määränpäähän
lähtö:
## ## GSK Home ## 105 100
Funktiotaulukko() osoittaa, että 105 matkaa menee GSK:lle ja 100 kotiin.
Voimme suodattaa tiedot palauttaaksemme yhden aineiston, jossa on 105 havaintoa, ja toisen, jossa on 100 havaintoa.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
lähtö:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
lähtö:
## [1] 105 14
Useita kriteerejä
Voimme suodattaa tietojoukon useammalla kuin yhdellä kriteerillä. Voit esimerkiksitract havainnot, joissa määränpää on Koti ja matka tapahtui keskiviikkona.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
lähtö:
## [1] 23 14
23 havaintoa vastasi tätä kriteeriä.
Common filter() -ehdot ja Operatorit R:ssä
filter() säilyttää kaikki rivit, joilla ehto on TOSI. Rivit, joiden arvo on NA, jätetään pois, mikä yllättää useimmat aloittelijat.
| OperaTor | Merkitys | esimerkki |
|---|---|---|
| == | Yhtä kuin | suodatin(df, SiirrytäänKoti == “Koti”) |
| != | Ei ole yhtä suuri kuin | suodatin(df, viikonpäivä != “Monday") |
| & | JA molempien on oltava voimassa | suodatin(df, Etäisyys > 50 & Maksiminopeus > 130) |
| | | TAI, kumpi tahansa voi pitää | suodatin(df, ViikonPäivä == “Monday” | ViikonPäivä == ”Perjantai”) |
| %%:ssa | Vastaa mitä tahansa vektorin arvoa | suodatin(df, Viikonpäivä %in% c(“Monday", "Perjantai")) |
| välillä() | Osuu numeerisen alueen sisälle | suodatin(df, välillä(Etäisyys, 48, 52)) |
| is.na() | Puuttuva arvo | suodatin(df, is.na(PolttoaineenTalous)) |
Kolme tapaa estää useimmat filter()-virheet.
- Käytä %in% ketjutetun TAI:n sijaan. suodatin(df, Viikonpäivä %in% c(“Monday”, ”perjantai”)) on lyhyempi ja paljon vaikeampi kirjoittaa väärin kuin kaksi pystysuoralla palkilla yhdistettyä ==-vertailua.
- Älä koskaan testaa puuttuvaa arvoa ==-merkillä. Lauseke x == NA palauttaa arvon NA, ei TOSI, joten rivi poistetaan hiljaisesti. Käytä sen sijaan is.na(x):ää.
- Pilkut tarkoittavat JA-operaattoria. filter(df, a, b) on identtinen filter(df, a & b) kanssa, minkä vuoksi aiempi esimerkki tässä tutoriaalissa toimii kummallakin tavalla.
Putki Operator kaksoiskappaleessa
Tietojoukon luominen vaatii paljon toimintoja, kuten:
- tuovan
- sulautuvan
- valitsemalla
- suodatus
- jne.
Dplyr-kirjastossa on käytännöllinen operaattori, %>%, nimeltään the putkiSe tekee datan käsittelystä siistimpää, nopeampaa ja vähemmän virhealtista.
Tämä operaattori on koodi, joka suorittaa vaiheita tallentamatta välivaiheita kiintolevylle. Jos palaat yllä olevaan esimerkkiimme, voit valita kiinnostavat muuttujat ja suodattaa ne. Meillä on kolme vaihetta:
- Vaihe 1: Tuo tiedot: Tuo GPS-tiedot
- Vaihe 2: Valitse tiedot: Valitse GoingTo ja DayOfWeek
- Vaihe 3: Suodata tiedot: Palauta vain kotiin ja keskiviikkoon
Voimme käyttää vaikeampaa tapaa tehdä se:
# 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)
lähtö:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Se ei ole kätevä tapa ketjuttaa useita toimintoja. Jokainen välitulos pysyy ympäristössä, ja nimet menettävät nopeasti merkityksensä.
Käytä sen sijaan pystyoperaattoria %>%. Nimeät datakehyksen kerran alussa, ja jokainen vaihe seuraa sitä.
Liukuhihnan perussyntaksi
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.
Voit luoda ensimmäisen putken noudattamalla yllä lueteltuja vaiheita.
# 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)
lähtö:
## [1] TRUE
Kaksi objektia ovat identtisiä, joten putki tuotti täsmälleen saman tuloksen yhdessä luettavassa lausekkeessa.
järjestää()
In edellinen opetusohjelma, opit lajittelemaan arvot funktiolla sort(). Kirjastossa dplyr on lajittelutoimintonsa. Se toimii kuin hurmaa putkilinjan kanssa. Arrange()-verbi voi järjestää uudelleen yhden tai useamman rivin joko nousevasti (oletus) tai laskevaksi.
- `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
Voimme lajitella etäisyyden määränpään mukaan.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
lähtö:
## 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-verbit R:ssä: Pikaopas
Alla olevassa taulukossa luetellaan kaikki tässä opetusohjelmassa käytetyt verbit syntakseineen ja palauttamineen:
| Verbi | Tavoite | Code | Selitys |
|---|---|---|---|
| vilaus | tarkista df:n rakenne |
glimpse(df)
|
Sama tarkoitus kuin str(), helpompi lukea |
| valitse () | Valitse/sulje pois muuttujat |
select(df, A, B ,C)
|
Valitse muuttujat A, B ja C |
select(df, A:C)
|
Valitse kaikki muuttujat A:sta C:hen | ||
select(df, -C)
|
Sulje pois C | ||
| suodattaa() | Pidä rivit yhden tai useamman ehdon mukaisina |
filter(df, condition1)
|
Yksi ehto |
filter(df, condition1 & condition2)
|
Kaksi ehtoa yhdistettynä JA-yhteyteen | ||
| järjestää() | Lajittele tietojoukko yhdellä tai useammalla muuttujalla |
arrange(A)
|
Nouseva muuttuja A |
arrange(A, B)
|
Nouseva muuttuja A ja B | ||
arrange(desc(A), B)
|
Laskeva muuttuja A ja nouseva laji B | ||
| %>% | Luo putki jokaisen vaiheen väliin |
step 1 %>% step 2 %>% step 3 |
