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.

  • 🔑 Ana Sütunlar: merge() işlevi, anahtarın her karede farklı bir ada sahip olması durumunda, by parametresine veya by.x ve by.y parametrelerine göre birleştirme yapar.
  • 🔗 Tam Maç: Varsayılan iç birleştirme, yalnızca anahtarı her iki veri çerçevesinde de bulunan satırları tutar.
  • 🧩 Kısmi Eşleşme: all.x = TRUE olarak ayarlamak, ilk çerçevenin her satırını korur ve boşlukları NA ile doldurur.
  • 📐 Boyut Kontrolü: Birleştirme işleminden önce ve sonra dim() değerlerini karşılaştırarak, birleştirme sırasında kaybolan veya yinelenen satırları tespit edin.
  • ⚙️ Katılım Kontrolü: all, all.x ve all.y bayrakları sırasıyla iç, sol, sağ veya tam dış davranışı seçer.
  • Modern Alternatif: dplyr, her bir birleştirme işlemini fiilin içinde adlandırır ve orijinal satır sırasını korur.

R'de Veri Çerçevelerini Birleştir

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

Kısmi birleştirmenin konsol çıktısı, Lucas'ın başlık sütununda NA olduğunu gösteriyor.

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

SSS

R, iki çerçevenin paylaştığı her sütun adına göre birleştirme işlemi yapar. Tek bir ortak sütun varsa bu uygundur; birden fazla ortak sütun varsa sonucu sessizce daraltır ve hiç ortak sütun yoksa çapraz birleştirme döndürür. Anahtarı açıkça adlandırmak, bu üç sürprizden de kaçınmayı sağlar.

Tek bir merge() çağrısıyla değil. Çağrıları zincirleyin veya Reduce(function(x, y) merge(x, y, by = “k”), list(df1, df2, df3)) ile bir listeyi katlayın. Her adımdan sonra satır sayısını doğrulayın, çünkü yinelenen anahtarlar hızla birleşir.

Her iki karede de aynı ada sahip, anahtar olmayan bir sütun bulunduğundan, R bunları birbirinden ayırır. Kopyalara anlamlı adlar vermek için suffixes = c(“_producer”, “_film”) ifadesini kullanın veya birleştirmeden önce gereksiz sütunu kaldırın.

Hayır. merge() fonksiyonu varsayılan olarak sonucu anahtar sütuna göre sıralar. Gelen sıralamayı korumak için sort = FALSE değerini geçirin veya başka bir yöntem kullanın. dplyr Bu birleştirme işlemi, sol taraftaki çerçevenin sırasını korur.

Bir vektör sağlayın: merge(x, y, by = c(“soyadı”, “yıl”)). İsimler farklı olduğunda, eşleşen vektörleri by.x ve by.y'ye iletin. Her iki vektör de sütunları aynı sırada listelemelidir.

`by = “row.names”` veya kısaltılmış `by = 0` ifadesini kullanın. R, satır adlarını `Row.names` adlı bir sütun olarak geri ekler; bu sütunu genellikle analize devam etmeden önce yeniden adlandırmak veya silmek istersiniz.

İki çerçeveyi ve satır sayılarını tanımlayın; yapay zeka asistanı muhtemel neden olarak yinelenen anahtarları işaret edecek ve duplicated() kontrolü önerecektir. Birleştirmeyi değiştirmeden önce teşhisi kendi verilerinizle doğrulayın.

Evet. RStudio Desktop 2023.09.0 ve sonrası, isteğe bağlı bir özellik sunmaktadır. GitHub Yardımcı Pilotu Yorumdan birleştirme işlemi taslağı oluşturan entegrasyon. Seçtiği birleştirme türünü kontrol edin, çünkü yanlış bir işaret satır sayısını sessizce değiştirir.

Bu yazıyı şu şekilde özetleyin: