Ühendage andmeraamid R: täielik ja osaline vaste

⚡ Nutikas kokkuvõte

Andmeraamide ühendamine R-is ühendab kaks tabelit ühe või mitme jagatud võtmeveeru alusel. Funktsioon merge() hõlmab sisemisi, vasakpoolseid, paremaid ja täielikke liitmisi ning see läbimäng demonstreerib nii täielikku kui ka osalist vastet.

  • 🔑 Põhiveerud: merge() liitub kas 'by'-ga või 'by.x' ja 'by.y'-ga, kui võtmel on igas kaadris erinev nimi.
  • 🔗 Täismäng: Vaikimisi sisemine liitmine säilitab ainult need read, mille võti esineb mõlemas andmeraamis.
  • 🧩 Osaline vaste: Kui määrata all.x = TRUE, säilitatakse esimese kaadri kõik read ja lüngad täidetakse väärtusega NA.
  • 📐 Mõõtmete kontroll: Võrdle dim() funktsiooni enne ja pärast ühendamist, et leida ühendamisel kaduma läinud või dubleeritud read.
  • ⚙️ Liitumiskontroll: Lipud all, all.x ja all.y valivad sisemise, vasaku, parema või täieliku välise käitumise.
  • 🛠️ Moodne alternatiiv: dplyr nimetab iga liitumise verbis endas ja säilitab algse ridade järjekorra.

Ühendage andmeraamid R-s

Väga sageli on meil andmeid mitmest allikast. Analüüsi tegemiseks peame ühendada kaks andmekaadrit koos ühe või mitmega tavalised võtmemuutujad.

Ühendamiste (liitumiste) tüübid R-is

Enne näidetega tegelema asumist on kasulik teada, et merge() teostab iga ühendustüübi, mida SQL-kasutaja ootab. Käitumist kontrollivad argumendid all, all.x ja all.y, mitte mõni muu funktsiooninimi.

Liitumistüüp Ridasid hoitakse merge() kutse dplyr-ekvivalent
Sisemine liitmine (vaikimisi) Mõlemas kaadris on ainult võtmed ühenda(x, y, poolt = "k") sisemine_liitumine(x, y, mille puhul = „k“)
Vasakpoolne ühendus Kõik x read, NA, kus y-l pole vastet ühenda(x, y, by = “k”, all.x = TRUE) left_join(x, y, by = “k”)
Parem välimine ühendus Kõik y read, NA, kus x-il pole vastet ühenda(x, y, by = “k”, all.y = TRUE) parempoolne_liitumine(x, y, mille korral = „k“)
Täielik välimine liitmine Iga rida mõlemast kaadrist ühenda(x, y, by = “k”, kõik = TÕENE) täisliitumine(x, y, mille korral = „k“)
Ristliit Iga ridade kombinatsioon ühenda(x, y, väärtusega = NULL) ristliitumine(x, y)

Enne esimest kõnet tasub meeles pidada kahte detaili:

  • Kui jätta ära „by”, siis R ühendab iga veeru nime, mida kaks kaadrit jagavad, mis on harva see, mida soovite.
  • merge() sorteerib tulemuse võtmeveeru järgi; sisestatud kirjete järjekorra säilitamiseks tuleb anda sort = FALSE.

Täielik vaste

Täielik vaste tagastab ainult need väärtused, millel on sihttabelis vaste. Read, millel vastet ei leita, eemaldatakse uuest andmeraamist. Osaline vaste seevastu säilitab need read ja täidab puuduvad veerud väärtusega NA.

Näeme lihtsat sisemine liitumine. Siseühenduse märksõna valib kirjed, millel on mõlemas tabelis vastavad väärtused. Kahe andmekogumi ühendamiseks saame kasutada funktsiooni merge(). Kasutame kolme argumenti:

merge(x, y, by.x = x, by.y = y)

Arguments:
-x: The origin data frame
-y: The data frame to merge
-by.x: The column used for merging in x data frame. Column x to merge on
-by.y: The column used for merging in y data frame. Column y to merge on

Näide:

Looge esimene muutujatega andmestik

  • perekonnanimi
  • kodakondsus

Looge teine ​​muutujatega andmestik

  • perekonnanimi
  • Filmid

Ühine võtmemuutuja on perekonnanimi. Saame mõlemad ühendada. andmeraamid ja kontrollige, kas mõõtmed on 7×3.

Lisame andmeraami stringsAsFactors=FALSE, kuna me ei taha R stringide teisendamiseks a-ks faktor; muutuja peaks jääma märgivektoriks. Alates R 4.0.0-st on see juba data.frame() jaoks vaikeväärtus, seega on argument uues koodis valikuline ja vanas koodis kahjutu.

# Create origin dataframe(

producers <- data.frame(   
    surname =  c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"),    
    nationality = c("US","US","UK","US","Poland"),    
    stringsAsFactors=FALSE)

# Create destination dataframe
movies <- data.frame(    
    surname = c("Spielberg",
		"Scorsese",
                "Hitchcock",
              	"Hitchcock",
                "Spielberg",
                "Tarantino",
                "Polanski"),    
    title = c("Super 8",
    		"Taxi Driver",
    		"Psycho",
    		"North by Northwest",
    		"Catch Me If You Can",
    		"Reservoir Dogs","Chinatown"),                
     		stringsAsFactors=FALSE)

# Merge two datasets
m1 <- merge(producers, movies, by.x = "surname")
m1
dim(m1)

Väljund:

surname		nationality		title
1 Hitchcock		UK		Psycho
2 Hitchcock		UK		North by Northwest
3 Polanski		Poland		Chinatown
4 Scorsese		US		Taxi Driver
5 Spielberg		US		Super 8
6 Spielberg		US		Catch Me If You Can
7 Tarantino		US		Reservoir Dogs

Ühendame andmeraamid, kui ühistel võtmemuutujatel on erinevad nimed.

Muudame filmi andmeraamis perekonnanime nimeks. Kasutame funktsiooni identsed (x1, x2), et kontrollida, kas mõlemad andmeraamid on identsed.

# Change name of ` movies ` dataframe
colnames(movies)[colnames(movies) == 'surname'] <- 'name'
# Merge with different key value
m2 <- merge(producers, movies, by.x = "surname", by.y = "name")
# Print head of the data
head(m2)

Väljund:

##surname     nationality		title
## 1 Hitchcock          UK		Psycho
## 2 Hitchcock          UK		North by Northwest
## 3 Polanski          Poland		Chinatown
## 4 Scorsese           US		Taxi Driver
## 5 Spielberg          US		Super 8
## 6 Spielberg          US		Catch Me If You Can
# Check if data are identical
identical(m1, m2)

Väljund:

## [1] TRUE

See näitab, et liitmine toimub isegi siis, kui veergude nimed on erinevad.

Osaline vaste

Ülaltoodud sisemine ühendus eemaldas vaikselt kõik, millel polnud vastet. Pole üllatav, et kahel andmeraamil pole samu ühiseid võtmemuutujaid. täielik sobitamine, tagastab andmeraam ainult ridu, mis on leitud nii x- kui ka y-andmeraamist. Koos osaline liitmine, on võimalik sobivate ridadeta ridu hoida teises andmeraamis. Nendel ridadel on NA nendes veergudes, mis on tavaliselt täidetud y väärtustega. Seda saame teha, kui määrame kõik.x= TRUE.

Näiteks saame tootja andmeraami lisada uue produtsendi, Lucase, ilma filmide andmeraamis olevate filmiviideteta. Kui määrame all.x= FALSE, liidab R ainult vastavad väärtused mõlemast andmestikust. Meie puhul produtsenti Lucast tulemusega ei liideta, kuna ta puudub ühest andmestikust.

Vaatame iga väljundi dimensiooni, kui määrame kõik.x= TRUE ja millal mitte.

# Create a new producer
add_producer <-  c('Lucas', 'US')
#  Append it to the ` producer` dataframe
producers <- rbind(producers, add_producer)
# Use a partial merge 
m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE)
m3

Väljund:

Allolev konsooli väljund näitab täiendavat Lucase rida, kus NA asendab puuduvat filmi pealkirja.

Osalise ühendamise konsooliväljund, mis näitab Lucast koos NA-ga tiitliveerus

# Compare the dimension of each data frame
dim(m1)

Väljund:

## [1] 7 3
dim(m2)

Väljund:

## [1] 7 3
dim(m3)

Väljund:

## [1] 8 3

Nagu näeme, on uue andmeraami suurus 8×3, võrreldes m1 ja m2 puhul 7×3-ga. R täidab pealkirja veeru väärtusega NA Lucase jaoks, kuna tegemist on produtsendiga, kellel filmide andmeraamis puudub sobiv rida.

merge() vs dplyr liitumised R-is

Baas R lahendab iga liitumise ühe funktsiooni ja lippude komplektiga. dplyr Pakett annab igale liitumisele oma verbi, mida paljudel meeskondadel on torujuhtmes lihtsam lugeda.

Kriteeriumid Baasühendamine() dplyr liitub
Liitumise valimine kõik.x / kõik.y / kõik lipud Tegusõnas nimetatud: left_join(), full_join()
Rea järjekord Sorteeritud võtme järgi, välja arvatud juhul, kui sort = FALSE Vasakpoolse tabeli järjekord säilib
Kiirus suurtel raamidel Aeglasemalt Üldiselt kiiremini
Puuduv võtmeveerg Ebaõnnestub hilja või ühendab valede veergude juures Vead kohe
Sõltuvad Base R, pole midagi installida Vajab dplyr paketti

Kaks ülaltoodud liitsõna on otse tõlgitavad dplyr-verbideks:

library(dplyr)
# Same inner join as merge(producers, movies, by.x = "surname", by.y = "name")
m4 <- inner_join(producers, movies, by = c("surname" = "name"))
# Same partial merge as all.x = TRUE
m5 <- left_join(producers, movies, by = c("surname" = "name"))

Base merge() on turvalisem valik paketi sees, mis ei tohiks sisaldada sõltuvusi. dplyr on parem valik interaktiivses analüüsis, kus loetavus ja kiirus on olulisemad.

Levinumad ühendamisvead R-is ja kuidas neid parandada

Enamik ühendamisprobleeme annab endast märku ootamatu reaarvuna, mitte veateatena, seega on dim() kontrollimine pärast iga ühendamist harjumus, mida tasub arendada.

  • Tulemuses on rohkem ridu kui kummalgi sisendil. Võti, mis kordub mõlemas kaadris, loob palju-mitmele-ühenduse ja R tagastab iga kombinatsiooni. Enne ühendamist kontrollige võtmeid funktsiooniga table(duplicated(x$k)).
  • Tulemus on tühi. Võtmeveerud erinevad tavaliselt tüübi poolest või on ühel neist lõpus tühikud. Käivita str() mõlemal kaadril ja puhasta võti enne ühendamist trimws() abil.
  • Veerud tulevad tagasi kujul title.x ja title.y. Mõlemal kaadril on sama nimega mitte-võtmeveerg. Päritolu ilmseks tegemiseks sisestage järelliited = c(“_producer”, “_film”).
  • Read pole enam oma algses järjekorras. merge() sorteerib vaikimisi võtme järgi. Lisa sort = FALSE või kasuta selgesõnaline sortimine pärast seda.
  • Peamine võrdlus ebaõnnestub tegurite osas. Võrdle märke, mitte teguritasemeid: enne vanemate R-i vaikesätetega loodud raamide ühendamist mässi võti as.character()-sse.

Kui sama liitmist tuleb korduvalt käivitada, mähkige see sisse kasutaja määratletud funktsioon seega ei saa argumendid jooksude vahel triivida.

KKK

R ühendab iga veeru nime puhul, mida kaks raami jagavad. Ühe jagatud veeru korral on see mugav; mitme veeru korral kitsendab see tulemust märkamatult ja kui ühtegi veergu pole, tagastab see ristühenduse. Võtme selgesõnaline nimetamine väldib kõiki kolme üllatust.

Mitte ühe merge() väljakutsega. Ahelda väljakutsed või murra loend funktsiooniga Reduce(function(x, y) merge(x, y, by = “k”), list(df1, df2, df3)). Kontrolli ridade arvu pärast iga sammu, sest duplikaatvõtmed liidetakse kiiresti.

Mõlemas kaadris oli sama nimega mitte-võtmeveerg, seega R teeb need üheselt mõistetavaks. Andke koopiatele tähendusrikaste nimede andmiseks järelliited = c("_producer", "_film") või eemaldage enne ühendamist üleliigne veerg.

Ei. merge() sorteerib tulemuse vaikimisi võtmeveeru järgi. Siseneva järjestuse säilitamiseks andke sort = FALSE või kasutage dplyr liitmine, mis säilitab vasakpoolse raami järjekorra.

Sisesta vektor: merge(x, y, by = c(“perekonnanimi”, “aasta”)). Kui nimed erinevad, anna vastavad vektorid edasi nii by.x kui ka by.y vektoritele. Mõlemad vektorid peavad loetlema veerud samas järjekorras.

Kasutage vormi by = „rea.nimed” või lühendit by = 0. R lisab reanimed tagasi veeruna nimega Row.names, mille tavaliselt tuleks enne analüüsi jätkamist ümber nimetada või eemaldada.

Kirjelda kahte kaadrit ja ridade arvu ning tehisintellekti assistent osutab tõenäolisele põhjusele dubleeritud võtmetele ja soovitab dubleeritud() kontrolli. Enne liitumise muutmist kinnita diagnoos oma andmetega.

Jah. RStuudio Desktop 2023.09.0 ja uuemad versioonid sisaldavad valikuvõimalust GitHubi koopia Integratsioon, mis loob kommentaarist liitmise. Kontrollige valitud liitmistüüpi, kuna vale märgistus muudab ridade arvu märkamatult.

Võta see postitus kokku järgmiselt: