dplyr R-opetusohjelmassa: Yhdistä ja liitä tietoja esimerkkien avulla

⚡ Älykäs yhteenveto

dplyr yhdistää ja liittää datakehyksiä R:ssä neljällä verbillä: left_join(), right_join(), inner_join() ja full_join(). Sen kumppanipaketti tidyr muotoilee sitten liitetyn tuloksen uudelleen käyttämällä gather()-, spread()-, separate()- ja unite()-funktioita.

  • 🔗 Mutatoivat liitokset: left_join() säilyttää jokaisen rivin alkuperäisestä taulukosta ja right_join() säilyttää jokaisen rivin kohdetaulukosta.
  • 🎯 Ottelun hallinta: inner_join() poistaa yhteensopimattomat rivit, kun taas full_join() säilyttää molemmat puolet ja täyttää aukot arvolla NA.
  • 🗝️ Yhdistelmäavaimet: Ohita = c("ID", "year") aina, kun yksi sarake ei yksilöi riviä yksiselitteisesti.
  • 🔄 Reshaping: gather() kääntää leveän taulukon pitkäksi ja spread() kääntää sen takaisin, keeping yksi muuttuja saraketta kohden.
  • ✂️ Erottaminen ja yhdistäminen: separate() jakaa sarakkeen erotinmerkin mukaan ja unite() yhdistää sarakkeet takaisin yhdeksi.
  • ⚠️ Versiohuomautus: pivot_longer(), pivot_wider() ja separate_wider_delim() korvaavat vanhemman tidyr-uudelleensijoituksenping toiminnot.

Dplyr R:ssä: Yhdistä ja liitä tiedot

Tietojen analysoinnin esittely

Ennen liittymistä tai uudelleenjakoaping verbi on järkevä, se auttaa näkemään, mihin datan manipulointi sopii. Tietojen analysointi voidaan jakaa kolmeen osaan:

  • ExtracTUKSEN: Ensin meidän on kerättävä tiedot useista lähteistä ja yhdistettävä ne.
  • Muuttaa: Tämä vaihe sisältää tietojen käsittelyn. Kun olemme yhdistäneet kaikki tietolähteet, voimme aloittaa tietojen puhdistamisen.
  • havainnollistaa: Viimeinen askel on visualisoida tietomme epäsäännöllisyyden tarkistamiseksi.

Alla oleva kaavio näyttää, miten kolme vaihetta yhdistyvät.

Kolmivaiheinen data-analyysiprosessi, joka näyttää esim.tractio, muuntaminen ja visualisointi
Tietojen analysointiprosessi

Yksi merkittävimmistä datatieteilijöiden kohtaamista haasteista on datan manipulointi. Dataa ei ole koskaan saatavilla halutussa muodossa. Datatieteilijöiden on käytettävä vähintään puolet ajastaan ​​datan puhdistamiseen ja manipulointiin. Se on yksi työnsä kriittisimmistä tehtävistä. Jos datan manipulointiprosessi ei ole täydellinen, tarkka ja perusteellinen, malli ei toimi oikein.

R-dplyr

R:llä on datamuunnoksia käsittelevä paketti nimeltä dplyr. Se perustuu pieneen joukkoon ydinfunktioita – filter(), select(), arrange(), mutate() ja summarize() – sekä useisiin liitosfunktioihin. Kun data on muotoiltu, ggplot2 voi visualisoida sen.

Opimme käyttämään dplyr-pakettia tiedoston manipulointiin. DatakehysJos R:ää ei ole vielä asennettu, noudata R:n ja RStudion asennusvaiheetja suorita sitten install.packages(“dplyr”).

Yhdistä tiedot dplyr-ohjelmalla

dplyr tarjoaa mukavan ja kätevän tavan yhdistää tietojoukkoja. Meillä voi olla monia syöttötietolähteitä, ja jossain vaiheessa meidän on yhdistettävä ne. Liittäminen dplyr:n kanssa lisää muuttujia alkuperäisen tietojoukon oikealle puolelle.

dplyr-liitokset

Seuraavassa on neljä tärkeää liitostyyppiä, joita käytetään dplyr-funktiossa kahden tietojoukon yhdistämiseen. Kaikki neljä ottavat samat argumentit – kaksi taulukkoa ja avaimen – ja eroavat toisistaan ​​vain siinä, mitkä yhteensopimattomat rivit säilyvät:

Toiminto Tavoite argumentit Useita näppäimiä
left_join() Yhdistä kaksi tietojoukkoa. Säilytä kaikki havainnot alkuperätaulukosta x, y, jonka = ”ID” x, y, by = c("ID", "ID2")
right_join() Yhdistä kaksi tietojoukkoa. Säilytä kaikki havainnot kohdetaulukosta x, y, jonka = ”ID” x, y, by = c("ID", "ID2")
inner_join() Yhdistä kaksi tietojoukkoa. Poista kaikki yhteensopimattomat rivit. x, y, jonka = ”ID” x, y, by = c("ID", "ID2")
full_join() Yhdistä kaksi tietojoukkoa. Säilytä kaikki havainnot. x, y, jonka = ”ID” x, y, by = c("ID", "ID2")

Nämä neljä verbiä vastaavat LEFT, RIGHT, INNER ja FULL OUTER -liitoksia SQLKantaluku R pääsee samoihin tuloksiin käyttämällä funktion all-, all.x- ja all.y-argumentteja yhdistää().

Tutkimme kaikkia liitostyyppejä helpon esimerkin avulla.

Ensin rakennamme kaksi datajoukkoa. Taulukko 1 sisältää kaksi muuttujaa, ID:n ja y:n, kun taas taulukko 2 sisältää ID:n ja z:n. Kummassakin tilanteessa tarvitsemme avainpari muuttuja. Meidän tapauksessamme henkilöllisyystodistus on meidän avain muuttuja. Funktio etsii identtisiä arvoja molemmista taulukoista ja sitoo palauttavat arvot taulukon 1 oikealle puolelle. Alla oleva kuva näyttää kaksi taulukkoa vierekkäin.

Kaksi esimerkkitaulukkoa, jotka jakavat ID-avainsarakkeen ennen dplyr-yhdistämistä

library(dplyr)
df_primary <- tribble(
  ~ID, ~y,
   "A", 5,
   "B", 5,
   "C", 8,
   "D", 0,
  "F", 9)
df_secondary <- tribble(
  ~ID, ~z,
   "A", 30,
   "B", 21,
   "C", 22,
   "D", 25,
   "E", 29)

dplyr left_join()

Yleisin tapa yhdistää kaksi tietojoukkoa on käyttää left_join()-funktiota. Alla oleva kuva näyttää, että avainpari vastaa rivejä A, B, C ja D, kun taas E ja F jäävät jäljelle. left_join()-funktiolla säilytämme kaikki rivit alkuperäisessä taulukossa ja jätämme huomiotta rivit, joilla ei ole avainparia kohdetaulukossa. Esimerkissämme arvoa E ei ole taulukossa 1, joten kyseinen rivi jätetään pois. Arvo F tulee alkuperäisestä taulukosta, joten se säilytetään left_join()-funktion jälkeen ja palauttaa arvon NA sarakkeessa z.

Esimerkki komennosta dplyr left_join()

Alla oleva kaavio näyttää, mitä left_join()-funktion aikana tapahtuu.

Kaavio dplyr left_join kee:stäping jokainen alkuperäisen taulukon rivi ja pudotaping ID E

left_join(df_primary, df_secondary, by ='ID')

lähtö:

## 
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>		
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA

Huomaa, että kun molemmissa taulukoissa on samanniminen sarake, dplyr yksiselitteistää ne yllä olevilla .x- ja .y-päätteillä.

dplyr oikea_liitos()

Right_join()-funktio toimii täsmälleen kuten left_join(). Ainoa ero on rivi pudonnut. Kohdedatakehyksessä käytettävissä oleva arvo E on uudessa taulukossa ja saa arvon NA sarakkeelle y.

Esimerkki komennosta dplyr right_join()

Alla oleva kaavio näyttää peilikuvan.

Kaavio dplyr right_join kee -toiminnostaping kohdetaulukon jokainen rivi ja pudotaping Tunnus F

right_join(df_primary, df_secondary, by = 'ID')

lähtö:

##
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     E    NA    29

dplyr inner_join()

Kun yhteensopimattomat havainnot eivät ole lainkaan hyödyllisiä, voimme palata vain rivit, jotka ovat olemassa sekä datajoukot. Tämä on oikea valinta, kun tarvitsemme täydellisen datajoukon emmekä halua implisoida puuttuvia arvoja keskiarvolla tai mediaanilla.

Tässä apuna tulee inner_join()-funktio. Se sulkee pois molempien puolien yhteensopimattomat rivit.

Esimerkki komennosta dplyr inner_join()

Alla oleva kaavio korostaa neljää tunnistetta, jotka säilyvät liittymisen jälkeen.

Kaavio dplyr inner_joinista, joka palauttaa vain neljä molemmissa taulukoissa olevaa tunnusta

inner_join(df_primary, df_secondary, by ='ID')

lähtö:

## 
# A tibble: 4 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25

dplyr full_join()

Lopuksi full_join()-funktio säilyttää kaikki havainnot ja korvaa puuttuvat arvot NA-arvolla.

Esimerkki komennosta dplyr full_join()

Alla oleva kaavio näyttää jokaisen tunnuksen molemmista taulukoista, jotka selviävät liittymisestä.

Kaavio dplyr full_join kee:stäping kaikki kuusi tunnistetta ja puuttuvien arvojen täyttäminen NA:lla

full_join(df_primary, df_secondary, by = 'ID')

lähtö:

## # A tibble: 6 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA
## 6     E    NA    29

Useita avainpareja

Viimeisenä muttei vähäisimpänä, datasetissämme voi olla useita avaimia. Tarkastellaan seuraavaa datasetiä, jossa on vuodet ja luettelo asiakkaan ostamista tuotteista. Alla olevassa kuvakaappauksessa näkyvät kaksi taulukkoa sekä ID- ja year-sarakkeet, jotka yhdessä tunnistavat rivin.

Kaksi datakehystä, jotka jakavat ID- ja year-sarakkeista koostuvan yhdistelmäavaimen

Jos yhdistämme molemmat taulukot pelkästään ID:n perusteella, jokainen vuosi täsmää jokaista vuotta vastaan ​​ja rivimäärä räjähtää. Tilanteen korjaamiseksi voimme välittää kaksi avainparimuuttujaa. Eli ID ja year, jotka esiintyvät molemmissa tietojoukoissa. Voimme käyttää seuraavaa koodia taulukoiden 1 ja 2 yhdistämiseen:

df_primary <- tribble(
  ~ID, ~year, ~items,
  "A", 2015,3,
  "A", 2016,7,
  "A", 2017,6,
  "B", 2015,4,
  "B", 2016,8,
  "B", 2017,7,
  "C", 2015,4,
  "C", 2016,6,
  "C", 2017,6)
df_secondary <- tribble(
  ~ID, ~year, ~prices,
  "A", 2015,9,
  "A", 2016,8,
  "A", 2017,12,
  "B", 2015,13,
  "B", 2016,14,
  "B", 2017,6,
  "C", 2015,15,
  "C", 2016,15,
  "C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))

lähtö:

## # A tibble: 9 x 4
##      ID  year items prices
##   <chr> <dbl> <dbl>  <dbl>
## 1     A  2015     3      9
## 2     A  2016     7      8
## 3     A  2017     6     12
## 4     B  2015     4     13
## 5     B  2016     8     14
## 6     B  2017     7      6
## 7     C  2015     4     15
## 8     C  2016     6     15
## 9     C  2017     6     13

Versiosta dplyr 1.1.0 (tammikuu 2023) lähtien sama avain voidaan kirjoittaa muodossa join_by(ID, year), ja dplyr varoittaa nyt odottamattomista monesta moneen -osumista, koska dplyr 1.1.0:n liittymisilmoitus selittää.

Tietojen puhdistustoiminnot R:ssä

Yhdistäminen ratkaisee vain puolet ongelmasta, koska yhdistettyä taulukkoa on vielä muotoiltava uudelleen. Seuraavassa on neljä tärkeää funktiota datan siistimiseksi (siivoamiseksi):

Toiminto Tavoite argumentit
kerätä() Muunna tiedot laajasta pitkiksi (data, avain, arvo, na.rm = EPÄTOSI)
levitän() Muunna tiedot pitkästä leveäksi (data, avain, arvo)
erillinen() Jaa yksi muuttuja kahteen (data, sarake, sisään, erittely = “”, poista = TOSI)
yhdistää() Yhdistä kaksi muuttujaa yhdeksi (data, col, conc, sep = “”, poista = TRUE)

Versiohuomautus: gather() ja spread() korvattiin pivot_longer()- ja pivot_wider()-funktioilla tidyr 1.0.0:ssa, ja separate_wider_delim()-perhe korvasi separate()-funktion tidyr 1.3.0:ssa. Korvatut funktiot toimivat edelleen, joten jokainen alla oleva esimerkki toimii, mutta uuden koodin tulisi suosia uudempia funktioperheitä, jotka on esitetty alla. tidyr-kääntyvä vinjetti.unite() pysyy ajan tasalla.

Käytämme tidyr-pakettia, joka on osa tidyverse-kokoelmaa, datan käsittelyyn, puhdistamiseen ja visualisointiin. Jos R asennettiin Anacondan kanssa, paketti on jo saatavilla osoitteesta https://anaconda.org/r/r-tidyr.

Jos et ole jo asennettu, anna seuraava komento asentaaksesi tidyr:

install.packages("tidyr")

kerätä()

gather()-funktion tavoitteena on muuttaa data leveästä pitkäksi.

Syntaksi

gather(data, key, value, na.rm = FALSE)
Arguments:
-data: The data frame used to reshape the dataset 
-key: Name of the new column created
-value: Select the columns used to fill the key column
-na.rm: Remove missing values. FALSE by default

esimerkki

Alla voimme visualisoida reshan käsitteenping leveästä pitkään. Haluamme luoda yhden sarakkeen nimeltä kasvu, joka täytetään neljännesmuuttujien riveillä. Alla olevassa kuvassa vasemmalla näkyy leveä taulukko ja oikealla uudelleenmuotoiltu pitkä taulukko.

Reshaping leveä neljännesvuosittainen taulukko pitkässä muodossa tidyr-keräystoiminnolla

library(tidyr)
# Create a messy dataset
messy <- data.frame(
  country = c("A", "B", "C"),
  q1_2017 = c(0.03, 0.05, 0.01),
  q2_2017 = c(0.05, 0.07, 0.02),
  q3_2017 = c(0.04, 0.05, 0.01),
  q4_2017 = c(0.03, 0.02, 0.04))
messy

lähtö:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04
# Reshape the data
tidier <-messy %>%
gather(quarter, growth, q1_2017:q4_2017)
tidier

lähtö:

##    country quarter growth
## 1        A q1_2017   0.03
## 2        B q1_2017   0.05
## 3        C q1_2017   0.01
## 4        A q2_2017   0.05
## 5        B q2_2017   0.07
## 6        C q2_2017   0.02
## 7        A q3_2017   0.04
## 8        B q3_2017   0.05
## 9        C q3_2017   0.01
## 10       A q4_2017   0.03
## 11       B q4_2017   0.02
## 12       C q4_2017   0.04

Funktiossa gather() luomme kaksi uutta muuttujaa, quarter ja growth, koska alkuperäisessä datasetissämme on yksi ryhmämuuttuja, country, ja avain-arvo-parit. Tidyr 1.0.0:ssa ja uudemmissa sama uudelleenmuotoilu kirjoitetaan muodossa pivot_longer(messy, cols = q1_2017:q4_2017, names_to = “quarter”, values_to = “growth”).

levitän()

spread()-funktio toimii päinvastoin kuin gather()-funktio.

Syntaksi

spread(data, key, value)
arguments: 
data: The data frame used to reshape the dataset
key: Column to reshape long to wide
value: Rows used to fill the new column

esimerkki

Voimme muokata siistimmän datasetin takaisin sotkuiseksi spread()-funktiolla.

# Reshape the data
messy_1 <- tidier %>%
  spread(quarter, growth) 
messy_1

lähtö:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04

Nykyaikainen vastine on pivot_wider(tidier, names_from = quarter, values_from = growth).

erillinen()

Separate()-funktio jakaa sarakkeen kahteen osaan erottimen mukaan. Tämä funktio on hyödyllinen tilanteissa, joissa muuttuja on päivämäärä. Analyysimme voi vaatia keskittymistä kuukauteen ja vuoteen, ja haluamme erottaa sarakkeen kahdeksi uudeksi muuttujaksi.

Syntaksi

separate(data, col, into, sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: The column to split
-into: The name of the new variables
-sep: Indicates the symbol used that separates the variable, i.e.:  "-", "_", "&"
-remove: Remove the old column. By default sets to TRUE.

esimerkki

Voimme jakaa vuosineljänneksen vuodesta siistimmässä tietojoukossa käyttämällä separat()-funktiota.

separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)

lähtö:

##   country Qrt year growth
## 1       A  q1 2017   0.03
## 2       B  q1 2017   0.05
## 3       C  q1 2017   0.01
## 4       A  q2 2017   0.05
## 5       B  q2 2017   0.07
## 6       C  q2 2017   0.02

yhdistää()

unite()-funktio yhdistää kaksi saraketta yhdeksi.

Syntaksi

unite(data, col, conc ,sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: Name of the new column
-conc: Name of the columns to concatenate
-sep: Indicates the symbol used that unites the variable, i.e:  "-", "_", "&"
-remove: Remove the old columns. By default, sets to TRUE

esimerkki

Yllä olevassa esimerkissä erottelimme neljänneksen vuodesta. Entä jos haluamme yhdistää ne? Käytämme seuraavaa koodia:

unit_tidier <- separate_tidier %>%
  unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)

lähtö:

##   country Quarter growth
## 1       A q1_2017   0.03
## 2       B q1_2017   0.05
## 3       C q1_2017   0.01
## 4       A q2_2017   0.05
## 5       B q2_2017   0.07
## 6       C q2_2017   0.02

Muotoiltu datakehys on nyt valmis mallinnusvaiheisiin, joita käsitellään jäljempänä. R-opetusohjelmasarja.

UKK

merge() ilmaisee jokaisen liitoksen all-, all.x- ja all.y-lippujen avulla, kun taas dplyr nimeää toiminnan itse verbissä. dplyr säilyttää myös alkuperäisen rivijärjestyksen ja palauttaa pienen arvon. R-perusreittiä käsitellään kohdassa yhdistä datakehykset opas.

Ne suodattavat liitoksia, joten ne eivät koskaan lisää sarakkeita. semi_join(x, y) säilyttää ne x:n rivit, joilla on osuma y:ssä, ja anti_join(x, y) säilyttää rivit, joilla ei ole osumaa. Molemmat ovat hyödyllisiä avainten auditointiin ennen mutatoivaa liitosta.

Karttaa ne eksplisiittisesti käyttämällä by = c(“ID” = “customer_id”) tai uudempaa join_by(ID == customer_id) -apufunktiota. Ilman karttaaping, dplyr löytää osumia jokaisesta jaetusta sarakkeen nimestä, mikä voi hiljaa rajata tulosta tai suurentaa sitä.

Avaimen arvo toistuu molemmilla puolilla, joten jokainen yhdistelmä tuotetaan. Tarkista ensin duplicated()-funktio kullekin avaimelle, yhdistä monen puolen arvot tai anna relationship = "many-to-many" ilmaisemaan tarkoitus. dplyr varoittaa odottamattomista monesta moneen -osumista.

filter() valitsee rivit, select() poimii sarakkeet, arrange() loitsuja, mutate() lisää sarakkeita ja summarize() kutistaa group_by()-funktion luomat ryhmät. Putki syöttää yhden tuloksen seuraavaan verbiin; %>% sisältyy dplyr-funktioon ja |> on R:n natiivi.

Tekoälyavustajat voivat profiloida datakehyksen, merkitä kaksoiskappaleet tai väärin kirjoitetut avaimet ennen liittämistä ja ehdottaa uudelleenjakoa.ping verbi, joka sopii asetteluun, ja selitä äkillinen rivimäärän muutos selkokielellä. Suorita koodi aina uudelleen ja tarkista mitat itse.

Kyllä. GitHub Copilot Toimii RStudio Desktop 2023.09.0:ssa ja uudemmissa versioissa ja suorittaa liitos- ja pivot-putkistot kommentin perusteella. Posit huomauttaa, että ehdotukset eivät ole deterministisiä, joten tarkista jokainen luotu rivi ennen sen suorittamista.

Ketjuta liitokset tai taita lista funktiolla Reduce(function(x, y) left_join(x, y, by = “ID”), list(df1, df2, df3)). purrr::reduce() tekee saman asian. Tarkista nrow() jokaisen vaiheen jälkeen, koska kaksoisavaimet yhdistyvät liitosten välillä.

Tiivistä tämä viesti seuraavasti: