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

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

