Dplyr Vodič: Spajanje i spajanje podataka u R s primjerima
Uvod u analizu podataka
Analiza podataka može se podijeliti u tri dijela:
- Vađenje: Prvo, moramo prikupiti podatke iz mnogih izvora i kombinirati ih.
- Transformirati: Ovaj korak uključuje manipulaciju podacima. Nakon što smo konsolidirali sve izvore podataka, možemo početi čistiti podatke.
- Vizualizirajte: Zadnji korak je vizualizacija naših podataka kako bismo provjerili nepravilnosti.
Jedan od najznačajnijih izazova s kojima se suočavaju podatkovni znanstvenici je manipulacija podacima. Podaci nikad nisu dostupni u željenom formatu. Znanstvenici koji se bave podacima trebaju provesti barem polovicu svog vremena čisteći i manipulirajući podacima. To je jedan od najkritičnijih zadataka u poslu. Ako proces manipulacije podacima nije potpun, precizan i rigorozan, model neće raditi ispravno.
R Dplyr
R ima biblioteku pod nazivom dplyr koja pomaže u transformaciji podataka. Biblioteka dplyr temelji se na četiri funkcije za manipuliranje podacima i pet glagola za čišćenje podataka. Nakon toga, možemo koristiti biblioteku ggplot za analizu i vizualizaciju podataka.
Naučit ćemo kako koristiti biblioteku dplyr za manipuliranje a Okvir podataka.
Spoji podatke s R Dplyr
dplyr pruža lijep i praktičan način kombiniranja skupova podataka. Možemo imati mnogo izvora ulaznih podataka iu nekom trenutku ćemo ih morati kombinirati. Spajanje s dplyr dodaje varijable s desne strane izvornog skupa podataka.
Dplyr se pridružuje
Slijede četiri važne vrste spojeva koji se koriste u dplyr za spajanje dva skupa podataka:
funkcija | Cilj | argumenti | Više tipki |
---|---|---|---|
lijevo_pridruživanje() | Spoji dva skupa podataka. Sačuvajte sva opažanja iz matične tablice | podaci, porijeklo, odredište, prema = “ID” | polazište, odredište, prema = c(“ID”, “ID2”) |
desno_pridruživanje() | Spoji dva skupa podataka. Sačuvajte sva zapažanja iz odredišne tablice | podaci, porijeklo, odredište, prema = “ID” | polazište, odredište, prema = c(“ID”, “ID2”) |
unutarnje_pridruživanje() | Spoji dva skupa podataka. Isključuje sve nepodudarne retke | podaci, porijeklo, odredište, prema = “ID” | polazište, odredište, prema = c(“ID”, “ID2”) |
full_join() | Spoji dva skupa podataka. Čuva sva zapažanja | podaci, porijeklo, odredište, prema = “ID” | polazište, odredište, prema = c(“ID”, “ID2”) |
Proučit ćemo sve vrste spojeva na jednostavnom primjeru.
Prije svega, gradimo dva skupa podataka. Tablica 1 sadrži dvije varijable, ID i y, dok tablica 2 okuplja ID i z. U svakoj situaciji moramo imati par ključeva varijabla. U našem slučaju ID je naš ključ varijabla. Funkcija će tražiti identične vrijednosti u obje tablice i vezati povratne vrijednosti s desne strane tablice 1.
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 lijevo_pridruživanje()
Najčešći način za spajanje dva skupa podataka je korištenje funkcije left_join(). Na slici ispod možemo vidjeti da se par ključeva savršeno podudara s redovima A, B, C i D iz oba skupa podataka. Međutim, E i F su ostali. Kako se odnosimo prema ova dva opažanja? Uz left_join(), zadržat ćemo sve varijable u izvornoj tablici i nećemo uzeti u obzir varijable koje nemaju upareni ključ u odredišnoj tablici. U našem primjeru, varijabla E ne postoji u tablici 1. Stoga će redak biti ispušten. Varijabla F dolazi iz izvorne tablice; zadržat će se nakon left_join() i vratiti NA u stupcu z. Slika ispod prikazuje što će se dogoditi s left_join().
Primjer dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
Izlaz:
## # 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
Dplyr right_join()
Funkcija right_join() radi točno kao left_join(). Jedina razlika je ispušten red. Vrijednost E, dostupna u odredišnom okviru podataka, postoji u novoj tablici i uzima vrijednost NA za stupac y.
Primjer dplyr right_join()
right_join(df_primary, df_secondary, by = 'ID')
Izlaz:
## # 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()
Kada smo 100% sigurni da se dva skupa podataka neće podudarati, možemo razmisliti o povratku samo redovi koji postoje u oboje skup podataka. To je moguće kada trebamo čist skup podataka ili kada ne želimo imputirati nedostajuće vrijednosti sa srednjom ili medijanom.
Inner_join() dolazi u pomoć. Ova funkcija isključuje retke koji se ne podudaraju.
Primjer dplyr inner_join()
inner_join(df_primary, df_secondary, by ='ID')
Izlaz:
## # 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()
Konačno, funkcija full_join() čuva sva opažanja i zamjenjuje nedostajuće vrijednosti s NA.
Primjer dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
Izlaz:
## # 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
Više parova ključeva
Posljednje, ali ne manje važno, možemo imati više ključeva u našem skupu podataka. Razmotrite sljedeći skup podataka gdje imamo godine ili popis proizvoda koje je kupac kupio.
Ako pokušamo spojiti obje tablice, R izbacuje pogrešku. Kako bismo popravili situaciju, možemo proslijediti dvije varijable para ključeva. To jest, ID i godina koji se pojavljuju u oba skupa podataka. Možemo koristiti sljedeći kod za spajanje tablice1 i tablice 2
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'))
Izlaz:
## # 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
Funkcije čišćenja podataka u R
Slijede četiri važne funkcije za pospremanje (čišćenje) podataka:
funkcija | Cilj | argumenti |
---|---|---|
skupiti () | Pretvorite podatke iz širokih u dugačke | (podaci, ključ, vrijednost, na.rm = FALSE) |
širenje() | Pretvorite podatke iz dugih u široke | (podatak, ključ, vrijednost) |
odvojeno() | Podijelite jednu varijablu u dvije | (data, col, into, sep= “”, remove = TRUE) |
jedinica() | Spojite dvije varijable u jednu | (data, col, conc, sep= “”, remove = TRUE) |
Koristimo urednu knjižnicu. Ova knjižnica pripada zbirci knjižnice za manipuliranje, čišćenje i vizualizaciju podataka. Ako instaliramo R s anacondom, biblioteka je već instalirana. Knjižnicu možemo pronaći ovdje, https://anaconda.org/r/r-tidyr.
Ako već nije instaliran, unesite sljedeću naredbu da instalirate tidyr:
install tidyr : install.packages("tidyr")
skupiti ()
Ciljevi funkcije gather() su transformirati podatke iz širokih u dugačke.
Sintaksa
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
Primjer
U nastavku možemo vizualizirati koncept preoblikovanja širokog u dugo. Želimo stvoriti jedan stupac pod nazivom rast, ispunjen redovima varijabli četvrtine.
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
Izlaz:
## 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
Izlaz:
## 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
U funkciji gather() stvaramo dvije nove varijable kvartal i rast jer naš izvorni skup podataka ima jednu grupnu varijablu: tj. zemlju i parove ključ-vrijednost.
širenje()
Funkcija spread() radi suprotno od skupljanja.
Sintaksa
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
Primjer
Možemo preoblikovati uredniji skup podataka natrag u neuredan pomoću spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
Izlaz:
## 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
odvojeno()
Funkcija separate() dijeli stupac na dva prema separatoru. Ova je funkcija korisna u nekim situacijama kada je varijabla datum. Naša analiza može zahtijevati fokusiranje na mjesec i godinu i želimo razdvojiti stupac u dvije nove varijable.
Sintaksa
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.
Primjer
Možemo razdvojiti tromjesečje od godine u urednijem skupu podataka primjenom funkcije separate().
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
Izlaz:
## 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
ujediniti()
Funkcija unite() povezuje dva stupca u jedan.
Sintaksa
unit(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
Primjer
U gornjem primjeru odvojili smo kvartal od godine. Što ako ih želimo spojiti. Koristimo sljedeći kod:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
Izlaz:
## 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
rezime
- Analiza podataka može se podijeliti u tri dijela: ekstrakcija, transformacija i vizualizacija.
- R ima biblioteku pod nazivom dplyr koja pomaže u transformaciji podataka. Biblioteka dplyr temelji se na četiri funkcije za manipuliranje podacima i pet glagola za čišćenje podataka.
- dplyr pruža lijep i praktičan način kombiniranja skupova podataka. Spajanje s dplyr dodaje varijable s desne strane izvornog skupa podataka.
- Ljepota dplyr-a je u tome što obrađuje četiri vrste spojeva sličnih SQL:
- lijevo_pridruživanje() – Za spajanje dva skupa podataka i zadržavanje svih opažanja iz izvorne tablice.
- desno_pridruživanje() – Za spajanje dva skupa podataka i zadržavanje svih promatranja iz odredišne tablice.
- unutarnje_pridruživanje() – Za spajanje dva skupa podataka i isključivanje svih nepodudarnih redaka.
- full_join() – Za spajanje dva skupa podataka i zadržavanje svih promatranja.
- Koristeći knjižnicu tidyr, možete transformirati skup podataka pomoću sljedećih funkcija:
- skupiti (): Pretvorite podatke iz širokih u dugačke.
- širenje(): Pretvorite podatke iz dugih u široke.
- odvojeno(): Podijelite jednu varijablu na dvije.
- jedinica(): Jedinica dvije varijable u jednu.