Spajanje okvira podataka u R: potpuno i djelomično podudaranje

Vrlo često imamo podatke iz više izvora. Da bismo izvršili analizu, moramo spojiti dva podatkovna okvira zajedno s jednim ili više zajedničke ključne varijable.

U ovom ćete vodiču naučiti

Potpuna utakmica

Potpuno podudaranje vraća vrijednosti koje imaju pandan u odredišnoj tablici. Vrijednosti koje se ne podudaraju neće biti vraćene u novom podatkovnom okviru. Međutim, djelomično podudaranje vraća vrijednosti koje nedostaju kao NA.

Vidjet ćemo jednostavan unutarnji spoj. Ključna riječ unutarnje spajanje odabire zapise koji imaju podudarne vrijednosti u obje tablice. Za spajanje dva skupa podataka možemo koristiti funkciju merge(). Koristit ćemo tri argumenta:

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

Primjer:

Stvorite prvi skup podataka s varijablama

  • prezime
  • državljanstvo

Stvorite drugi skup podataka s varijablama

  • prezime
  • filmovi

Zajednička ključna varijabla je prezime. Možemo spojiti oba podatka i provjeriti je li dimenzionalnost 7×3.

Dodajemo stringsAsFactors=FALSE u okvir podataka jer ne želimo R da pretvorimo niz kao faktor, želimo da se varijabla tretira kao znak.

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

Izlaz:

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

Spojimo podatkovne okvire kada varijable zajedničkog ključa imaju različita imena.

Mijenjamo prezime u ime u podatkovnom okviru filmova. Koristimo funkciju identical(x1, x2) da provjerimo jesu li oba podatkovna okvira identična.

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

Izlaz:

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

Izlaz:

## [1] TRUE

Ovo pokazuje da se operacija spajanja izvodi čak i ako su nazivi stupaca različiti.

Djelomično podudaranje

Nije iznenađujuće da dva podatkovna okvira nemaju iste zajedničke ključne varijable. u potpuno podudaranje, dataframe se vraća samo redaka koji se nalaze i u x i u podatkovnom okviru. S djelomično spajanje, moguće je zadržati retke bez odgovarajućih redaka u drugom okviru podataka. Ovi redovi će imati NA u onim stupcima koji su obično ispunjeni vrijednostima iz y. To možemo učiniti postavljanjem all.x= TRUE.

Na primjer, možemo dodati novog producenta, Lucasa, u podatkovni okvir producenta bez referenci filma u podatkovnom okviru filmova. Ako postavimo all.x= FALSE, R će spojiti samo podudarne vrijednosti u oba skupa podataka. U našem slučaju, producent Lucas neće se pridružiti spajanju jer nedostaje u jednom skupu podataka.

Pogledajmo dimenziju svakog izlaza kada specificiramo all.x= TRUE i kada ne specificiramo.

# 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

Izlaz:

Djelomično podudaranje

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

Izlaz:

## [1] 7 3
dim(m2)

Izlaz:

## [1] 7 3
dim(m3)

Izlaz:

## [1] 8 3

Kao što vidimo, dimenzija novog podatkovnog okvira je 8×3 u usporedbi sa 7×3 za m1 i m2. R uključuje NA za autora koji nedostaje u podatkovnom okviru knjiga.