Adatkeretek egyesítése R-ben: Teljes és részleges egyezés
Nagyon gyakran több forrásból is vannak adataink. Az elemzés elvégzéséhez szükségünk van összeolvad két adatkeret egy vagy több adatkerettel együtt közös kulcsváltozók.
Ebben az oktatóanyagban megtudhatja
Teljes meccs
A teljes egyezés olyan értékeket ad vissza, amelyeknek megfelelőjük van a céltáblázatban. Azok az értékek, amelyek nem egyeznek, nem jelennek meg az új adatkeretben. A részleges egyezés azonban a hiányzó értékeket NA-ként adja vissza.
Egy egyszerűt fogunk látni belső összekapcsolás. Az inner join kulcsszó kiválasztja azokat a rekordokat, amelyek mindkét táblában egyező értékkel rendelkeznek. Két adatkészlet összekapcsolásához a merge() függvényt használhatjuk. Három argumentumot fogunk használni:
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
Példa:
Hozzon létre első adatkészletet változókkal
- vezetéknév
- állampolgárság
Hozzon létre második adatkészletet változókkal
- vezetéknév
- filmek
A közös kulcsváltozó a vezetéknév. Egyesíthetjük mindkét adatot, és ellenőrizhetjük, hogy a dimenzió 7×3.
A stringsAsFactors=FALSE értéket hozzáadjuk az adatkerethez, mert nem akarjuk R A karakterlánc faktorként való konvertálásához azt szeretnénk, hogy a változó karakterként legyen kezelve.
# 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)
output:
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
Egyesítsük össze az adatkereteket, ha a közös kulcsváltozóknak más a neve.
A vezetéknevet névre változtatjuk a filmek adatkeretében. Az identical(x1, x2) függvényt használjuk annak ellenőrzésére, hogy a két adatkeret azonos-e.
# 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)
output:
##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)
output:
## [1] TRUE
Ez azt mutatja, hogy az egyesítési művelet akkor is megtörténik, ha az oszlopnevek eltérőek.
Részleges egyezés
Nem meglepő, hogy két adatkeretben nem ugyanazok a közös kulcsváltozók. Ban,-ben teljes egyezés, az adatkeret visszatér csak sorok mind az x, mind az y adatkeretben találhatók. Val vel részleges összevonás, lehetőség van az egyező sorok nélküli sorok megtartására a másik adatkeretben. Ezeknek a soroknak NA lesz azokban az oszlopokban, amelyek általában y értékekkel vannak kitöltve. Ezt az all.x= TRUE beállításával tehetjük meg.
Például hozzáadhatunk egy új producert, Lucast a produceri adatkerethez anélkül, hogy a filmek adatkeretében szerepelnének filmhivatkozások. Ha az all.x= FALSE értéket adjuk meg, akkor R csak az egyező értékeket fogja össze mindkét adatkészletben. Esetünkben a gyártó Lucas nem csatlakozik az egyesítéshez, mert hiányzik egy adatkészletből.
Nézzük meg az egyes kimenetek dimenzióját, amikor megadjuk az all.x= TRUE értéket, és amikor nem.
# 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
output:
# Compare the dimension of each data frame dim(m1)
output:
## [1] 7 3
dim(m2)
output:
## [1] 7 3
dim(m3)
output:
## [1] 8 3
Amint látjuk, az új adatkeret mérete 8×3 a 7×3-hoz képest m1 és m2 esetén. R tartalmazza a hiányzó szerző NA-ját a könyvek adatkeretében.