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.

  • 📋 Sarakkeen valinta: select(df, A, B) säilyttää nimetyt sarakkeet, select(df, A:C) säilyttää alueen ja select(df, -C) poistaa yhden.
  • 🔎 Rivien suodatus: filter(df, condition) pitää vastaavat rivit ja ehdot yhdistetään et-merkillä JA-operaattorin tapauksessa tai pystysuoralla palkilla TAI-operaattorin tapauksessa.
  • 🔣 Lajittelu: arrange() järjestää rivit oletusarvoisesti nousevaan järjestykseen, ja desc() kääntää minkä tahansa yksittäisen sarakkeen järjestyksen.
  • 🔗 Putki Operator: %>% -operaattori siirtää jokaisen tuloksen suoraan seuraavaan verbiin, joten väliobjektit eivät sotke ympäristöä.
  • 🧹 Avustajafunktiot: starts_with(), contains() ja where() valitsevat sarakkeet kuvion tai tyypin mukaan nimen sijaan.
  • 📐 Verbien järjestyksellä on merkitystä: Suodata tiedot alkuvaiheessa, valitse ne ja järjestä ne sitten, jolloin myöhemmät vaiheet pysyvät edullisempina.

R Valitse suodatin Järjestä putkisto

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

UKK

Magrittr %>% -putki toimitetaan dplyr-komennon kanssa ja tukee paikkamerkkisyntaksia pisteellä. Natiivi |>-putki tuli mukaan R 4.1:ssä eikä tarvitse pakettia. Molemmat välittävät vasemmanpuoleisen tuloksen oikeanpuoleiseen ensimmäiseen argumenttiin.

Ei. Jokainen dplyr-verbi palauttaa uuden datakehyksen ja jättää syötteen koskemattomaksi. Sinun on liitettävä tulos objektiin tai lähetettävä se eteenpäin, jotta muutos pysyy voimassa.

Vertailu NA-arvoon palauttaa NA-arvon TRUE-arvon sijaan, ja filter() säilyttää vain rivit, jotka ovat TOSI. Käytä is.na()-funktiota valitaksesi puuttuvat arvot tarkoituksella tai drop_na()-funktiota tidyr-funktiosta poistaaksesi ne.

Tekoälymallien ominaisuuksien suunnittelu koostuu enimmäkseen rivien suodattamisesta, sarakkeiden valitsemisesta ja lajittelusta. dplyr ilmaisee nämä vaiheet luettavina prosesseina, joita tarkistajat voivat auditoida, mikä on tärkeää, kun harjoitusdatan on oltava toistettavissa.

Kyllä. Tekoälyavustajat voivat kääntää sulkujen osajoukon select()- ja filter()-kutsuiksi ja selittää putken. Suorita aina molemmat versiot ja vertaa ulottuvuuksia, koska perus-R ja dplyr käsittelevät puuttuvia arvoja eri tavalla.

Tiivistä tämä viesti seuraavasti: