R'de Veri Çerçevelerini Birleştir: Tam ve Kısmi Eşleşme
⚡ Akıllı Özet
R'da veri çerçevelerini birleştirmek, iki tabloyu bir veya daha fazla ortak anahtar sütunu üzerinden bir araya getirir. `merge()` fonksiyonu iç, sol, sağ ve tam birleştirmeleri kapsar ve bu kılavuz hem tam eşleştirmeyi hem de kısmi eşleştirmeyi göstermektedir.

Çoğunlukla birden fazla kaynaktan veri alıyoruz. Bir analiz gerçekleştirmek için şunları yapmamız gerekir: birleştirme bir veya daha fazla veri çerçevesiyle birlikte iki veri çerçevesi ortak anahtar değişkenler.
R'de Birleştirme (Birleştirme) Türleri
Örnekleri incelemeye geçmeden önce, merge() fonksiyonunun bir SQL kullanıcısının beklediği her birleştirme türünü gerçekleştirdiğini bilmek faydalı olacaktır. Davranış, farklı bir fonksiyon adı yerine all, all.x ve all.y argümanları tarafından kontrol edilir.
| Birleştirme türü | Satırlar saklandı | merge() çağrısı | dplyr eşdeğeri |
|---|---|---|---|
| İç birleştirme (varsayılan) | Her iki karede de yalnızca anahtarlar mevcuttur. | merge(x, y, by = “k”) | inner_join(x, y, by = “k”) |
| Sol dış katılma | x ve NA değerlerinin tüm satırları, y'nin eşleşmesi olmayan yerlerde. | merge(x, y, by = “k”, all.x = TRUE) | sol_birleştirme(x, y, by = “k”) |
| Sağ dış birleşim | x'in eşleşmesi olmayan y ve NA'nın tüm satırları | merge(x, y, by = “k”, all.y = TRUE) | sağ_birleştirme(x, y, by = “k”) |
| Tam dış birleştirme | Her iki çerçevedeki her satır | merge(x, y, by = “k”, all = TRUE) | full_join(x, y, by = “k”) |
| Çapraz katılma | Her satır kombinasyonu | merge(x, y, by = NULL) | çapraz_birleştirme(x, y) |
İlk görüşmeden önce iki ayrıntıyı hatırlamakta fayda var:
- "By" ifadesini dışarıda bırakmak, R'nin iki çerçevenin paylaştığı her sütun adına göre birleştirme yapmasına neden olur ki bu da nadiren istediğiniz bir şeydir.
- `merge()` fonksiyonu sonucu anahtar sütuna göre sıralar; gelen sırayı korumak için `sort = FALSE` değerini geçirin.
Tam eşleşme
Tam eşleşme, yalnızca hedef tabloda karşılığı olan değerleri döndürür. Eşleşme bulunmayan satırlar yeni veri çerçevesinden çıkarılır. Kısmi eşleşme ise bu satırları korur ve eksik sütunları NA ile doldurur.
Basit bir şey göreceğiz iç birleşim. İç birleştirme anahtar sözcüğü, her iki tabloda da eşleşen değerlere sahip kayıtları seçer. İki veri kümesini birleştirmek için merge() fonksiyonunu kullanabiliriz. Üç argüman kullanacağız:
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
Örnek:
Değişkenlerle İlk Veri Kümesini Oluşturun
- soyadı
- milliyet
Değişkenlerle İkinci Veri Kümesi Oluşturun
- soyadı
- filmler
Ortak anahtar değişken soyadıdır. İkisini birleştirebiliriz. veri çerçeveleri ve boyutun 7×3 olduğunu kontrol edin.
Veri çerçevesine stringsAsFactors=FALSE ekliyoruz çünkü istemiyoruz R dizeleri bir şeye dönüştürmek faktörDeğişken karakter vektörü olarak kalmalıdır. R 4.0.0'dan beri bu, data.frame() için zaten varsayılan değerdir, bu nedenle argüman yeni kodda isteğe bağlıdır ve eski kodda zararsızdır.
# 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)
Çıktı:
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
Ortak anahtar değişkenlerin farklı adları olduğunda veri çerçevelerini birleştirelim.
Film veri çerçevesinde soyadını isimle değiştiriyoruz. Her iki veri çerçevesinin de aynı olup olmadığını kontrol etmek için özdeş(x1, x2) fonksiyonunu kullanırız.
# 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)
Çıktı:
##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)
Çıktı:
## [1] TRUE
Bu, sütun adları farklı olsa bile birleştirme işleminin yapıldığını gösterir.
Kısmi eşleşme
Yukarıdaki iç birleştirme, karşılığı olmayan her şeyi sessizce attı. İki veri çerçevesinin aynı ortak anahtar değişkenlerine sahip olmaması şaşırtıcı değil. tam eşleştirmeveri çerçevesi geri döner bir tek hem x hem de y veri çerçevesinde bulunan satırlar. İle kısmi birleşme, eşleşen satırları olmayan satırları diğer veri çerçevesinde tutmak mümkündür. Bu satırlar, genellikle y'den gelen değerlerle dolu olan sütunlarda NA'ya sahip olacaktır. Bunu all.x= TRUE ayarını yaparak yapabiliriz.
Örneğin, filmler veri çerçevesindeki film referansları olmadan, yapımcı veri çerçevesine yeni bir yapımcı olan Lucas'ı ekleyebiliriz. Eğer all.x=FALSE olarak ayarlarsak, R yalnızca her iki veri kümesindeki eşleşen değerleri birleştirecektir. Bizim durumumuzda, yapımcı Lucas bir veri kümesinde eksik olduğu için sonuca dahil edilmeyecektir.
all.x= TRUE belirttiğimizde ve belirtmediğimizde her bir çıktının boyutunu görelim.
# 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
Çıktı:
Aşağıdaki konsol çıktısı, eksik film başlığı yerine NA'nın kullanıldığı fazladan Lucas satırını göstermektedir.
# Compare the dimension of each data frame
dim(m1)
Çıktı:
## [1] 7 3
dim(m2)
Çıktı:
## [1] 7 3
dim(m3)
Çıktı:
## [1] 8 3
Gördüğümüz gibi, yeni veri çerçevesi m1 ve m2 için 7×3 iken 8×3'tür. R, film veri çerçevesinde eşleşen bir satırı olmayan yapımcı Lucas için başlık sütununu NA ile doldurur.
R'da merge() ve dplyr birleştirmeleri
Temel R, her birleştirme işlemini tek bir fonksiyon ve bir dizi bayrak kullanarak çözer. dplyr Bu paket, her bir birleştirme işlemine kendi fiilini atıyor; bu da birçok ekip için işlem hattında okumayı daha kolay hale getiriyor.
| Kriterler | Temel birleştirme() | dplyr katılıyor |
|---|---|---|
| Birleşmeyi seçmek | tüm.x / tüm.y / tüm bayraklar | Fiilde adı geçenler: left_join(), full_join() |
| Satır sırası | Sıralama işlemi, sort = FALSE olmadığı sürece anahtara göre yapılır. | Soldaki masanın sırası korunmuştur. |
| Büyük çerçevelerde hız | yavaş | Genellikle daha hızlı |
| Eksik anahtar sütun | Geç başarısız oluyor veya yanlış sütunlarda birleştirme yapıyor. | Hatalar hemen |
| Bağımlılıklar | Base R, kurulum gerektirmez. | dplyr paketini gerektirir. |
Yukarıda gösterilen iki birleştirme işlemi doğrudan dplyr fiillerine çevrilir:
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"))
Bağımlılık içermemesi gereken bir paket içinde `base merge()` daha güvenli bir seçenektir. Okunabilirliğin ve hızın daha önemli olduğu etkileşimli analizlerde ise `dplyr` daha iyi bir seçenektir.
R'da Sık Görülen Birleştirme Hataları ve Bunların Nasıl Düzeltileceği
Birleştirme sorunlarının çoğu, hata mesajı yerine beklenmedik bir satır sayısı olarak kendini gösterir; bu nedenle her birleştirmeden sonra dim() fonksiyonunu kontrol etmek edinilmesi gereken faydalı bir alışkanlıktır.
- Sonuçta, girdi olarak verilen değerlerden daha fazla satır bulunmaktadır. İki çerçevede de tekrarlanan bir anahtar, çoktan çoğa bir birleştirme oluşturur ve R her kombinasyonu döndürür. Birleştirmeden önce anahtarları table(duplicated(x$k)) ile inceleyin.
- Sonuç boş. Anahtar sütunlar genellikle tür bakımından farklılık gösterir veya birinde sonda boşluklar bulunur. Birleştirmeden önce her iki çerçevede de str() fonksiyonunu çalıştırın ve trimws() fonksiyonu ile anahtarı temizleyin.
- Sütunlar title.x ve title.y olarak geri döner. Her iki karede de aynı ada sahip, anahtar olmayan bir sütun bulunmaktadır. Kaynağı açıkça belirtmek için sonekleri = c(“_producer”, “_film”) olarak geçirin.
- Satırlar artık orijinal sıralarında değil. `merge()` varsayılan olarak anahtara göre sıralama yapar. `sort = FALSE` ekleyin veya şunu kullanın: açık bir sıralama sonradan.
- Önemli bir karşılaştırma bazı faktörler açısından başarısız oluyor. Karakterleri karşılaştırın, faktör seviyelerini değil: eski R varsayılan ayarları altında oluşturulan çerçeveleri birleştirmeden önce anahtarı `as.character()` içine alın.
Aynı birleştirme işleminin tekrar tekrar çalıştırılması gerektiğinde, işlemi bir blok içine alın. kullanıcı tanımlı fonksiyon Bu sayede argümanlar çalıştırmalar arasında sapma gösteremez.

