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:

Részleges egyezés

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