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