dplyr R-i õpetuses: andmete ühendamine ja ühendamine näidetega
⚡ Nutikas kokkuvõte
dplyr ühendab ja liidab R-is andmekaadreid nelja tegusõna abil: left_join(), right_join(), inner_join() ja full_join(). Selle kaaspakett tidyr kujundab seejärel liidetud tulemuse ümber, kasutades gather(), spread(), separate() ja unite() funktsioone.

Sissejuhatus andmeanalüüsi
Enne liitumist või ümberjagamistping Kui tegusõnal on mõte, aitab see näha, kuhu andmetega manipuleerimine sobib. Andmete analüüs võib jagada kolmeks osaks:
- Extracmine: Esiteks peame koguma andmeid paljudest allikatest ja ühendama need.
- Muutma: see samm hõlmab andmete töötlemist. Kui oleme kõik andmeallikad koondanud, saame hakata andmeid puhastama.
- Visualiseerima: Viimane samm on meie andmete visualiseerimine, et kontrollida eeskirjade eiramist.
Allolev diagramm näitab, kuidas need kolm etappi omavahel ühenduvad.

Üks olulisemaid väljakutseid, millega andmeteadlased silmitsi seisavad, on andmetega manipuleerimine. Andmed pole kunagi soovitud vormingus saadaval. Andmeteadlased peavad vähemalt poole oma ajast kulutama andmete puhastamisele ja manipuleerimisele. See on üks töö kõige kriitilisemaid ülesandeid. Kui andmete manipuleerimise protsess ei ole täielik, täpne ja range, siis mudel ei tööta õigesti.
R-dplyr
R-il on pakett nimega dplyr, mis tegeleb andmete teisendamisega. See on üles ehitatud väikese hulga põhiverbide – filter(), select(), arrange(), mutate() ja summarize() – ning liitmisfunktsioonide perekonna ümber. Kui andmed on vormindatud, saab ggplot2 neid visualiseerida.
Me õpime, kuidas kasutada dplyr paketti a manipuleerimiseks AndmeraamKui R pole veel installitud, järgige R ja RStudio seadistamise sammud, seejärel käivitage install.packages(“dplyr”).
Andmete ühendamine dplyriga
dplyr pakub kena ja mugava viisi andmehulkade kombineerimiseks. Meil võib olla palju sisendandmete allikaid ja mingil hetkel peame need kombineerima. Ühendus dplyr-ga lisab muutujad algsest andmekogumist paremale.
dplyr liitumised
Järgnevalt on toodud neli olulist ühendustüüpi, mida kasutatakse funktsioonis dplyr kahe andmestiku ühendamiseks. Kõik neli võtavad samad argumendid – kaks tabelit ja võti – ning erinevad ainult selle poolest, millised vasteta read jäävad alles:
| funktsioon | Eesmärk | Argumendid | Mitu klahvi |
|---|---|---|---|
| left_join() | Ühendage kaks andmekogumit. Säilita kõik vaatlused päritolutabelist | x, y, kõrval = "ID" | x, y, by = c("ID", "ID2") |
| right_join() | Ühendage kaks andmekogumit. Hoidke kõik vaatlused sihttabelist alles | x, y, kõrval = "ID" | x, y, by = c("ID", "ID2") |
| inner_join() | Kahe andmestiku ühendamine. Kõigi vasteta ridade välistamine | x, y, kõrval = "ID" | x, y, by = c("ID", "ID2") |
| full_join() | Ühenda kaks andmekogumit. Säilita kõik vaatlused. | x, y, kõrval = "ID" | x, y, by = c("ID", "ID2") |
Need neli verbi seostuvad LEFT, RIGHT, INNER ja FULL OUTER ühendustega SQLBaas R jõuab samade tulemusteni argumentide all, all.x ja all.y kaudu ühenda().
Uurime kõiki ühendustüüpe lihtsa näite abil.
Esiteks loome kaks andmekogumit. Tabel 1 sisaldab kahte muutujat, ID ja y, samas kui tabel 2 kogub ID ja z. Igas olukorras vajame võtmepaar muutuv. Meie puhul on ID meie võti muutuja. Funktsioon otsib mõlemast tabelist identseid väärtusi ja seob tagastatavad väärtused tabeli 1 paremale küljele. Allolev joonis näitab kahte tabelit kõrvuti.
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()
Kõige levinum viis kahe andmestiku ühendamiseks on funktsiooni left_join() kasutamine. Allolev pilt näitab, et võtmepaar vastab ridadele A, B, C ja D, samas kui E ja F jäävad alles. Funktsiooniga left_join() säilitame kõik read algtabelis ja ignoreerime ridu, millel sihttabelis võtmepaari pole. Meie näites väärtust E tabelis 1 ei eksisteeri, seega see rida jäetakse välja. Väärtus F pärineb algtabelist, seega säilitatakse see pärast funktsiooni left_join() ja tagastab veerus z väärtuse NA.
Näide dplyr left_join()
Allolev diagramm kujutab left_join() funktsiooni ajal toimuvat.
left_join(df_primary, df_secondary, by ='ID')
Väljund:
## # 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
Pane tähele, et kui mõlemal tabelil on samanimeline veerg, siis dplyr eristab neid ülaltoodud sufiksitega .x ja .y.
dplyr parempoolne_liitumine()
Funktsioon right_join() töötab täpselt nagu left_join(). Ainus erinevus on see, et rida on maha jäetud. Sihtandmeraamis saadaval olev väärtus E on uues tabelis olemas ja võtab veeru y väärtuse NA.
Näide dplyr right_join()
Allolev diagramm näitab peegelpilti.
right_join(df_primary, df_secondary, by = 'ID')
Väljund:
## # 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 sisemine_liitumine()
Kui sobitamata vaatlustest pole mingit kasu, saame naasta ainult read, mis eksisteerivad mõlemad andmekogumid. See on õige valik, kui vajame täielikku andmekogumit ja ei soovi puuduvaid väärtusi keskmise või mediaaniga asendada.
Siin tuleb appi funktsioon inner_join(). See jätab välja mõlema poole sobimatud read.
dplyr inner_join() näide
Allolev diagramm toob esile neli ID-d, mis pärast liitumist alles jäävad.
inner_join(df_primary, df_secondary, by ='ID')
Väljund:
## # 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 täisliitumine()
Lõpuks säilitab funktsioon full_join() kõik vaatlused ja asendab puuduvad väärtused väärtusega NA.
Näide dplyr full_join()
Allolev diagramm näitab mõlema tabeli kõiki ID-sid, mis pärast liitumist ellu jäävad.
full_join(df_primary, df_secondary, by = 'ID')
Väljund:
## # 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
Mitu võtmepaari
Viimaseks, aga mitte vähem tähtsaks, võib meie andmestikus olla mitu võtit. Vaatleme järgmist andmestikku, kus on aastad ja kliendi ostetud toodete loend. Allolev ekraanipilt näitab kahte tabelit ning ID ja aasta veerge, mis koos identifitseerivad rea.
Kui ühendame mõlemad tabelid ainult ID järgi, siis vastendatakse iga aasta iga aastaga ja ridade arv plahvatab. Olukorra parandamiseks saame edastada kaks võtmepaari muutujat. See tähendab ID ja aasta, mis esinevad mõlemas andmekogumis. Tabeli 1 ja tabeli 2 ühendamiseks saame kasutada järgmist koodi:
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'))
Väljund:
## # 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
Alates dplyr 1.1.0 versioonist (jaanuar 2023) saab sama võtit kirjutada kujul join_by(ID, aasta) ja dplyr hoiatab nüüd ootamatute mitmest mitmele vastete eest, kuna dplyr 1.1.0 liitumiskuulutus selgitab.
Andmete puhastamise funktsioonid R-is
Ühendamine lahendab ainult poole probleemist, sest ühendatud tabelit tuleb ikkagi ümber kujundada. Järgnevalt on toodud neli olulist funktsiooni andmete korrastamiseks (puhastamiseks):
| funktsioon | Eesmärk | Argumendid |
|---|---|---|
| koguma () | Muutke andmed laiast pikaks | (andmed, võti, väärtus, na.rm = VÄÄR) |
| levik() | Muutke andmed pikkadest laiadeks | (andmed, võti, väärtus) |
| eralda () | Jaga üks muutuja kaheks | (andmed, veerg, sisse, jaotus = “”, eemalda = TÕENE) |
| ühenda () | Ühenda kaks muutujat üheks | (andmed, veerg, konts, jaotus = “”, eemalda = TÕENE) |
Versiooni märkus: gather() ja spread() asendati tidyr 1.0.0 versioonis pivot_longer() ja pivot_wider() funktsioonidega ning separate() asendati tidyr 1.3.0 versioonis separate_wider_delim() perekonnaga. Asendatavad funktsioonid töötavad endiselt, seega kõik allolevad näited töötavad, kuid uus kood peaks eelistama uuemaid perekonnaliikmeid, mis on näidatud tabelis. tidyr pöörlev vinjett.unite() jääb kehtivaks.
Andmete töötlemiseks, puhastamiseks ja visualiseerimiseks kasutame paketti tidyr, mis kuulub tidyverse'i kollektsiooni. Kui R installiti koos Anacondaga, on pakett juba saadaval aadressilt https://anaconda.org/r/r-tidyr.
Kui pole veel installitud, sisestage tidyr installimiseks järgmine käsk:
install.packages("tidyr")
koguma ()
Funktsiooni gather() eesmärk on teisendada andmed laiast pikaks.
Süntaks
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
Näide
Allpool saame visualiseerida resha kontseptsiooniping laiast pikaks. Me tahame luua ühe veeru nimega kasv, mis täidetakse kvartalimuutujate ridadega. Allolev joonis näitab vasakul laia tabelit ja paremal ümberkujundatud pikka tabelit.
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
Väljund:
## 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
Väljund:
## 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
Funktsioonis gather() loome kaks uut muutujat, quarter ja growth, kuna meie algsel andmestikul on üks grupimuutuja, country ja võtme-väärtuse paarid. Tidyr 1.0.0 ja uuemates versioonides kirjutatakse sama kujund järgmiselt: pivot_longer(messy, cols = q1_2017:q4_2017, names_to = “quarter”, values_to = “growth”).
levik()
Funktsioon spread() teeb funktuuri gather() vastandit.
Süntaks
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
Näide
Korralikuma andmestiku saame spread() abil taas segaseks muuta.
# Reshape the data
messy_1 <- tidier %>%
spread(quarter, growth)
messy_1
Väljund:
## 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
Selle tänapäevane vaste on pivot_wider(tidier, names_from = quarter, values_from = growth).
eralda ()
Funktsioon separate() jagab veeru eraldaja abil kaheks. See funktsioon on abiks olukordades, kus muutuja on kuupäev. Meie analüüs võib nõuda keskendumist kuule ja aastale ning me tahame veeru kaheks uueks muutujaks jagada.
Süntaks
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.
Näide
Saame kvartali jaotada aastast korrastatud andmekogumis, rakendades funktsiooni separation().
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
Väljund:
## 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
ühenda ()
Funktsioon unite() ühendab kaks veergu üheks.
Süntaks
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
Näide
Ülaltoodud näites eraldasime kvartali aastasest. Mis siis, kui tahame need ühendada? Kasutame järgmist koodi:
unit_tidier <- separate_tidier %>%
unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)
Väljund:
## 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
Ümberkujundatud andmeraam on nüüd valmis ülejäänud osas käsitletud modelleerimisetappideks. R õpetuste sari.







