İki Tablo, Bir Anahtar
Gerçek veri nadiren tek bir tabloda yaşar. Müşteriler bir veri çerçevesinde, siparişleri başka birinde durur ve "her müşteri ne kadar harcadı?" sorusu ikisine birden ihtiyaç duyar. Onları bağlayan şey bir anahtardır: her tabloda bulunan ve aynı varlığı tanımlayan bir sütun. Tabloları bir anahtar üzerinden birleştirmek bir join (SQL'in sözcüğü) ya da bir merge'tür (temel R'nin sözcüğü); aynı işlem.
İşte bu sayfanın kalanının kullandığı tablo çifti. 5 numaralı müşterinin sipariş verdiğine ama müşteri tablosunda olmadığına, 2 ve 4 numaralı müşterilerin ise hiç sipariş vermediğine dikkat edin:
Uyuşmazlıklar bilinçlidir - bir join'in eşleşmeyen satırlarla ne yaptığı, tam olarak join türlerini birbirinden ayıran şeydir.
merge(): Varsayılan Olarak Inner Join
merge(x, y, by = "key"), anahtarları eşit olan satırları eşleştirir ve sütunlarını birbirine yapıştırır. Varsayılan olarak yalnızca her iki tabloda da bulunan anahtarları korur - bir inner join:
Üç satır geri geliyor. Ana iki kez görünüyor - iki siparişi var ve bir join, eşleşen her çift için bir çıktı satırı üretir. Ben ve Dana yok (sipariş yok) ve 5 numaralı müşterinin gizemli siparişi de yok (müşteri yok). Bir inner join, eşleşmeyen satırları her iki tablodan da sessizce atar - yalnızca eksiksiz çiftler umurunuzdaysa tam da doğru, değilse sessiz bir veri kaybı hatasıdır.
Left, Right ve Full Join'ler: all.x, all.y, all
Eşleşmeyen satırları korumak için hangi tablonun satırlarının kutsal olduğunu söyleyin. all.x = TRUE, ilk tablonun her satırını korur - pratikte en çok kullanılan join olan left join:
Artık Ben ve Dana amount sütununda NA ile hayatta kalıyor - "bu müşteri var; hiçbir sipariş eşleşmedi." O NA değerleri çöp değil, bilgi taşıyor: is.na(result$amount) tam olarak hiç sipariş vermemiş müşterilerin listesidir (eksik değerler belgesi onlarla çalışmayı ele alıyor). Kalan çeşitler aynı fikrin başka yöne çevrilmiş hâlidir: all.y = TRUE ikinci tablonun her satırını korur (right join - bilinmeyen 5 numaralı müşterinin siparişi name sütununda NA ile hayatta kalırdı) ve all = TRUE her iki taraftan her şeyi korur (full join).
Şunu sorarak seçin: kimin satırlarını kaybetmeye iznim yok? Bir ana tabloyu arama verisiyle zenginleştiriyorsanız - left join, ana tablo önce. Her iki yönü denetliyorsanız - full join.
Farklı Anahtar İsimleri: by.x ve by.y
Tablolar isimlendirmede nadiren hemfikirdir - birinde id, diğerinde customer_id. Yeniden adlandırmayın; merge() fonksiyonuna iki ismi de söyleyin:
Çıktı, anahtar için ilk tablonun ismini korur. İlgili bir konu: iki tablo anahtar olmayan sütun isimlerini paylaşıyorsa (diyelim ki ikisinde de bir date var), merge onlara date.x ve date.y sonekleri ekler - onları hemen yeniden adlandırın, berbat okunuyorlar.
dplyr Join'leri
dplyr her join türüne kendi fiilini verir; böylece niyet bayrak argümanlarında değil fonksiyon adında durur (statik; kum havuzu yalnızca temel R çalıştırır):
library(dplyr)
left_join(customers, orders, by = "id")
inner_join(customers, orders, by = "id")
full_join(customers, orders, by = "id")
left_join(customers, orders, by = c("id" = "customer_id")) # different names
Okunabilirliğin ötesinde left_join(), ilk tablonun satır sırasını korur (merge() anahtara göre yeniden sıralar) ve çoktan-çoğa eşleşmeler konusunda yüksek sesle uyarır - fiil ailesi için bkz. dplyr girişi.
Hakkı yenen üye anti_join() fonksiyonudur: ilk tablonun, ikincide eşleşmesi olmayan satırlarını döndürür - sütun eklenmez, yalnızca artakalanlar:
anti_join(customers, orders, by = "id") # customers who never ordered
O soru - "hangi satırlar eşleşemedi?" - veri temizlemede sürekli karşımıza çıkar (eşleşmeyen kimlikler, öksüz kayıtlar, başarısız aramalar) ve temel R'nin customers[!(customers$id %in% orders$id), ] yazması gereken yerde anti_join() bunu tek bir çağrıda yanıtlar.
Satırları Üst Üste Eklemek: rbind()
Join, iki tablonun sütunlarını birleştirir. Bunun yerine elinizde aynı türden iki satır yığını varsa - ocak ayının siparişleri ve şubat ayınınkiler - onları rbind() ile üst üste yığarsınız:
Gereklilik katıdır: her iki veri çerçevesinin de sütun adları aynı olmalıdır (sıra fark etmez - rbind isme göre eşleştirir). Eksik ya da fazla bir sütun, NA doldurması değil bir hatadır. Yığınların sütunları kaymışsa dplyr'ın bind_rows() fonksiyonu daha bağışlayıcıdır - isme göre hizalar ve boşlukları NA ile doldurur.
Yinelenen Anahtar Patlaması
Klasik join kazası: benzersiz sandığınız ama olmayan anahtarlar - hem de iki tabloda birden. Her eşleşme her eşleşmeyle çiftlenir ve satırlar çoğalır:
İki satırın iki satırla birleştirilmesi dört satır verir - her x her y ile çiftlenir. Gerçek veride 10.000 satırlık bir tablo böyle 3 milyon satıra ve gelir toplamı böyle iki katına çıkar. merge() bunu sessizce yapar. Savunma bir alışkanlıktır: birleştirmeden önce benzersiz varsaydığınız anahtarı kontrol edin - anyDuplicated(customers$id) 0 olmalı - ve birleştirdikten sonra nrow() değerini beklediğinizle sağlama yapın.
Buradan Ne Çıkarıyorsunuz
merge(x, y, by = "key")bir inner join'dir - eşleşmeyen satırlar sessizce kaybolur.all.x = TRUE(left),all.y = TRUE(right),all = TRUE(full) eşleşmeyen satırları korur veNAile doldurur.- Farklı anahtar isimleri: temel R'de
by.x/by.y, dplyr'daby = c("a" = "b"). - dplyr her join'i isimlendirir;
anti_join()- eşleşmeyen satırlar - hakkı yenen olandır. rbind()aynı biçimli tabloları yığar; sütunlar isme göre eşleşmelidir.- Yinelenen anahtarlar satırları sessizce çoğaltır - öncesinde
anyDuplicated(), sonrasındanrow()kontrol edin.
Sırada: pivot_longer() ve pivot_wider() ile geniş ve uzun biçimler arasında yeniden şekillendirme.
Sıkça Sorulan Sorular
R'de iki veri çerçevesini nasıl birleştiririm?
Ortak anahtar sütunuyla merge(x, y, by = "key") kullanın. Varsayılan olarak inner join yapar - yalnızca anahtarı her iki veri çerçevesinde de bulunan satırlar hayatta kalır. Left join için all.x = TRUE, right join için all.y = TRUE ya da full join için all = TRUE ekleyin.
R'de left join nasıl yapılır?
Temel R: merge(x, y, by = "key", all.x = TRUE), x'in her satırını korur ve eşleşme olmayan yerlerde y sütunlarını NA ile doldurur. dplyr: left_join(x, y, by = "key") - aynı sonuç ve ayrıca x'in orijinal satır sırasını korur; merge() bunu yapmaz.
Anahtar sütunların isimleri farklı olduğunda veri çerçevelerini nasıl birleştiririm?
merge() fonksiyonuna iki ismi de söyleyin: merge(x, y, by.x = "id", by.y = "customer_id"). dplyr'daki karşılığı left_join(x, y, by = c("id" = "customer_id")) ya da modern yardımcıyla by = join_by(id == customer_id) şeklindedir.
R'de merge ile rbind arasındaki fark nedir?
Farklı boyutlarda birleştirirler. merge() iki tablonun satırlarını bir anahtara göre eşleştirir ve sütunlarını birleştirir - bir join. rbind() ise bir tablonun satırlarını diğerinin altına yığar - ikisinin sütun adları aynı olmalıdır. Sütunları özdeş aylık dosyalar rbind() ister; müşteriler artı siparişler merge() ister.