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.

  • 🔗 Muteerivad liitumised: left_join() säilitab lähtetabeli kõik read ja right_join() säilitab sihttabeli kõik read.
  • 🎯 Mängu kontroll: inner_join() eemaldab sobimatud read, samas kui full_join() säilitab mõlemad pooled ja täidab lüngad väärtusega NA.
  • 🗝️ Liitvõtmed: Jätke = c("ID", "aasta") alati, kui üks veerg ei tuvasta rida üheselt.
  • 🔄 Reshaping: gather() pöörab laia tabeli pikaks ja spread() pöörab selle tagasi, keeping üks muutuja veeru kohta.
  • ✂️ Eraldamine ja ühendamine: separate() jagab veeru eraldaja järgi ja unite() ühendab veerud tagasi üheks.
  • ⚠️ Versiooni märkus: pivot_longer(), pivot_wider() ja separate_wider_delim() asendavad vanema tidyr reshaping funktsioone.

Dplyr R-is: andmete ühendamine ja ühendamine

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.

Kolmeastmeline andmeanalüüsi protsess, mis näitab näidettractsioon, teisendus ja visualiseerimine
Andmete analüüsi protsess

Ü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.

Kaks näidistabelit, mis jagavad ID-võtme veergu enne dplyr-i ühendamist

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.

dplyr left_join kee skeemping iga lähtetabeli rida ja langetageping ID E

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.

Dplyr right_join kee skeemping sihttabeli iga rida ja tilkping ID F

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.

dplyr inner_join'i diagramm, mis tagastab ainult neli ID-d mõlemas tabelis

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.

dplyr full_join kee skeemping kõik kuus ID-d ja puuduvate väärtuste täitmine NA-ga

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.

Kaks andmeraami jagavad ID ja aasta veergudest koosnevat liitvõtit

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.

Reshaping lai kvartalitabel pikas vormingus tidyr-i kogumisfunktsiooniga

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.

KKK

merge() väljendab iga liitumist lippude all, all.x ja all.y kaudu, samas kui dplyr nimetab käitumise verbis endas. dplyr säilitab ka algse ridade järjekorra ja tagastab tibble'i. Baas-R-marsruuti käsitletakse siin. andmeraamide ühendamine juhend.

Need filtreerivad ühendusi, seega ei lisa nad kunagi veerge. semi_join(x, y) säilitab x read, millel on vaste y-s, ja anti_join(x, y) säilitab read, millel vastet pole. Mõlemad on kasulikud võtmete auditeerimiseks enne muteeruvat liitu.

Kaardistage need selgesõnaliselt funktsiooniga by = c(“ID” = “customer_id”) või kasutage uuemat abimeest join_by(ID == customer_id). Ilma kaarditaping, dplyr leiab vasteid iga jagatud veerunime puhul, mis võib tulemust märkamatult kitsendada või selle suureks paisutada.

Võtme väärtus kordub mõlemal poolel, seega genereeritakse iga kombinatsioon. Kontrollige esmalt iga võtme puhul funktsiooni duplicated(), agregeerige mitme poole väärtused või edastage kavatsuse väljendamiseks relationship = „palju-paljule“. dplyr hoiatab ootamatute mitme-paljule vastete eest.

filter() valib read, select() valib veerud, arrange() ilm, mutate() lisab veerge ja summarize() ahendab group_by() loodud grupid. Toru suunab ühe tulemuse järgmisse tegusõnasse; %>% kaasneb dplyr-iga ja |> on R-i natiivne.

Tehisintellekti assistendid saavad andmeraami profiilida, enne liitumist duplikaat- või valesti sisestatud võtmeid märgistada, ümberjagamist soovitadaping tegusõna, mis sobib paigutusega, ja selgita reaarvu järsku muutust lihtsas keeles. Käivita kood alati uuesti ja kontrolli mõõtmeid ise.

Jah. GitHubi koopia Töötab RStudio Desktop 2023.09.0 ja uuemates versioonides ning teostab kommentaari põhjal torujuhtmete ühendamise ja pöördliikumise. Posit märgib, et soovitused ei ole deterministlikud, seega vaadake enne käivitamist iga genereeritud rida üle.

Ahelda ühendused või voldi loend funktsiooniga Reduce(function(x, y) left_join(x, y, by = “ID”), list(df1, df2, df3)). purrr::reduce() teeb sama asja. Kontrolli funktsiooni nrow() pärast iga sammu, sest duplikaatvõtmed moodustavad ühenduste vahel liite.

Võta see postitus kokku järgmiselt: