12 Veri duzenleme - IV

  • join() fonksiyonlari ile iki farklı veri seti birleştirilebilir.

    • left_join()
    • right_join()
    • full_join()
    • inner_join()
    • semi_join()
    • anti_join()

12.1 join()

  • join() fonksiyonları iki veri setini istenilen şekilde birleştirme amacıyla kullanılırlar. Örneğin elimizde A ve B olmak üzere iki farklı veri seti olsun. Her iki veri setini birleştirmek istediğimizde bu veri setlerinden hangi satır veya sütunları seçeceğimizi, satırların eşleşip eşleşmeyeceğini hangi değişkenlerle belirleneceğinin bilinmesi gerekmektedir. Bu nedenle de her bir amaca yönelik join fonksiyon türleri belirlenmiştir. Bunlar; left_join(), right_join(), full_join(), inner_join(), semi_join(), anti_join() fonksiyonlarıdır.

12.2 left_join()

  • A %>% left_join(B) ile A verisindeki tüm satırlar, mümkün olduğunda B verisi ile eşleştirilerek (olmadığında "NA" verir), hem A hem de B'den gelen sütunlar alınır.
Şekil 1. left_join fonksiyonu
Şekil 1. left_join fonksiyonu

Şekil 1'de, left_join() fonksiyonu ile öncelikle X1 değişkenine ait tüm gözlemler alınmıştır. X2 değişkenine ait ID numarası "1" olan gözlem olmadığı için yeni veri setinde bu kısım kayıp veri (NA) olarak girilmiştir. Burada birleştirme yapılacak iki veri setine ait ortak bir değişkenin ("ID") olması önemlidir.

Örnek bir veri seti üzerinden açıklayalım. miniPISA1, miniPISA verisinden öğrenci ıd, cinsiyet ve ST097Q01TA,ST097Q02TA değişkenlerinin ve bu veri setinin ilk altı satırının seçilmesi ile oluşturulur.

library(dplyr) # paketin aktifleştirilmesi
load("import/miniPISA.rda") # verinin yüklenmesi
miniPISA1 <- miniPISA %>% select(OGR_ID,CNSYT,ST097Q01TA,ST097Q02TA) #değişkenlerin seçimi
miniPISA1<-miniPISA1[1:6,] #veri setinin ilk 6 satırının seçilmesi
miniPISA1
OGR_ID CNSYT ST097Q01TA ST097Q02TA
79200768 2 1 2
79201064 2 3 2
79201118 1 2 3
79201275 2 2 2
79201481 2 3 3
79201556 2 3 3

miniPISA1 verisinin oluşturulmasından sonra miniPISA2 verisi oluşturulur. Öncelikle miniPISA verisinden öğrenci id, okumaktan zevk alma ve okuma olası değer1 puanları değişkenleri seçilir. Ardından bu veri setinin ilk yedi satırı seçilir ve üçüncü satır silinir. Sonuç olarak altı satırlık bir miniPISA2 veri seti elde edilmiş olur.

miniPISA2<- miniPISA %>% select(OGR_ID,O_ZEVK,O_OD1) #değişkenlerin seçimi
miniPISA2<-miniPISA2[1:7,] #veri setinin ilk 7 satırının seçilmesi
miniPISA2<-miniPISA2[-3,] #veri setinin 3. satırının çıkarılması
miniPISA2
OGR_ID O_ZEVK O_OD1
1 79200768 -0.29 376.02
2 79201064 0.60 512.32
4 79201275 -1.15 393.01
5 79201481 0.67 552.46
6 79201556 0.36 441.29
7 79201652 -0.09 410.65

Elimizde bulunan miniPISA1 ve miniPISA2 veri setlerini kullanılarak left_join() fonksiyonu ile birleştirme işlemi uygulanır.

miniPISA1 %>% left_join(miniPISA2) #veri birleştirme
OGR_ID CNSYT ST097Q01TA ST097Q02TA O_ZEVK O_OD1
79200768 2 1 2 -0.29 376.02
79201064 2 3 2 0.60 512.32
79201118 1 2 3 NA NA
79201275 2 2 2 -1.15 393.01
79201481 2 3 3 0.67 552.46
79201556 2 3 3 0.36 441.29

Elde edilen çıktı incelendiğinde, miniPISA1 verisindeki tüm satırlar, miniPISA2 verisi ile eşleştirilmiş, "79201652" ıd numaralı öğrenci miniPISA1 de olmadığından hiç alınmamıştır. "79201118" ıd numaralı öğrenci ise miniPISA2 verisinde yer almadığında okumaktan zevk alma ve okuma olası değer1 değişkenleri "NA" olarak oluşturulmuştur.

12.3 right_join()

A %>% left_join(B) ile B verisindeki tüm satırlar, mümkün olduğunda A verisi ile eşleştirilerek (olmadığında "NA" verir), hem A hem de B den gelen sütunlar alınır.

Şekil 2. right_join fonksiyonu
Şekil 2. right_join fonksiyonu

Şekil 2'de, right_join() fonksiyonu ile öncelikle X2 değişkenine ait tüm gözlemler alınmıştır. X1 değişkenine ait ID numarası "3" olan gözlem olmadığı için yeni veri setinde bu kısım kayıp veri(NA) olaraK girilmiştir. Burada da left_join() fonksiyonunda olduğu gibi birleştirme yapılacak iki veri setine ait ortak bir değişkenin ("ID") olması önemlidir.

Örnek veri seti üzerinden açıklayalım:

miniPISA1 %>% right_join(miniPISA2) # veri birleştirme
OGR_ID CNSYT ST097Q01TA ST097Q02TA O_ZEVK O_OD1
79200768 2 1 2 -0.29 376.02
79201064 2 3 2 0.60 512.32
79201275 2 2 2 -1.15 393.01
79201481 2 3 3 0.67 552.46
79201556 2 3 3 0.36 441.29
79201652 NA NA NA -0.09 410.65

Elde edilen çıktı incelendiğinde, miniPISA2 verisindeki tüm satırlar, miniPISA1 verisi ile eşleştirilmiş, "79201118" ıd numaralı öğrenci miniPISA2 de olmadığından oluşturulan veri setine hiç alınmamıştır. "79201652" ıd numaralı öğrenci ise miniPISA1 verisinde yer almadığında cinsiyet, ST097Q01TA, ST097Q01TA değişkenleri "NA" olarak oluşturulmuştur. Görüldüğü üzere left_join() ile right_join() fonksiyonları arasındaki fark eşleştirme öncesi temel alınacak ana veri setinin farklı olmasıdır. Fakat pratikte genellikle left_join() fonksiyonu kullanılır.

12.4 inner_join(B)

  • A %>% inner_join(B) ile sadece A ve B nin eşleşen satırlarını birleştirir. Yani hem A hem de B den gelen sütunları alır.
Şekil 3. inner_join fonksiyonu
Şekil 3. inner_join fonksiyonu

Şekil 3'te, inner_join() fonksiyonu ile öncelikle "ID" değişkeni baz alınarak ortak olan satırlar yani 2. satır birleştirilir.

miniPISA1 %>% inner_join(miniPISA2) # veri birleştirme
OGR_ID CNSYT ST097Q01TA ST097Q02TA O_ZEVK O_OD1
79200768 2 1 2 -0.29 376.02
79201064 2 3 2 0.60 512.32
79201275 2 2 2 -1.15 393.01
79201481 2 3 3 0.67 552.46
79201556 2 3 3 0.36 441.29

"OGR_ID" değişkeni ortak değişken olduğundan bu değişkene göre birleştirme işlemi yapılmış ve sadece her iki veri setinde yer alan öğrenciler seçilmiştir. Bu durumda "79201118" ve "79201652" id numaraya sahip öğrenciler birleştirme işleminden sonra yeni veri setinde yer almamıştır. Böylece yeni veri seti dört satırdan oluşmuştur.

12.5 full_join()

A %>% full_join(B) ile A ve B veri setinde yer alan tüm satırları birleştirir. Hem A hem de B den gelen sütunları alır.

Şekil 4. full_join fonksiyonu
Şekil 4. full_join fonksiyonu

Şekil 4'te, full_join() fonksiyonu ile öncelikle "ID" değişkeni baz alınarak iki veri setinde de yer alan tüm değişkenler birleştirilir.

miniPISA1 %>% full_join(miniPISA2) # veri birleştirme
OGR_ID CNSYT ST097Q01TA ST097Q02TA O_ZEVK O_OD1
79200768 2 1 2 -0.29 376.02
79201064 2 3 2 0.60 512.32
79201118 1 2 3 NA NA
79201275 2 2 2 -1.15 393.01
79201481 2 3 3 0.67 552.46
79201556 2 3 3 0.36 441.29
79201652 NA NA NA -0.09 410.65

"OGR_ID" değişkeni ortak değişken olduğundan bu değişkene göre birleştirme işlemi yapılmış ve her ikiveri setinde yer alan tüm öğrenciler seçilmiştir.Bu durumda "79201118" ve "79201652" id numaraya sahip öğrenciler birleştirme işleminden sonra yeni veri setinde yer almıştır. Böylece yeni veri seti yedi satırdan oluşmuştur.

12.6 semi_join()

A %>% semi_join(B) ile A veri setinin B ile eşleşen satırları alınarak sadece A dan gelen sütunlar yeni veri setinde yer alır.

Şekil 5. semi_join fonksiyonu
Şekil 5. semi_join fonksiyonu

Şekil 5'te, semi_join() fonksiyonu ile öncelikle "ID" değişkeni baz alınarak ortak olan satırlar yani 2. satır birleştirilir. Fakat yine sadece A veri setinde yer alan değişken ya da değişkenler alınır.

miniPISA1 %>% semi_join(miniPISA2)
OGR_ID CNSYT ST097Q01TA ST097Q02TA
79200768 2 1 2
79201064 2 3 2
79201275 2 2 2
79201481 2 3 3
79201556 2 3 3

Çıktıda miniPISA1 verisinin miniPISA2 verisi ile eşleşen satırları ele alındığından "79201118" id numaralı öğrenci yeni veri setine dahil edilmemiştir. Ayrıca yeni veri setinde sadece miniPISA1 değişkeninde yer alan cinsiyet,ST097Q01TA,ST097Q02TA değişkenleri yer almıştır.

A %>% anti_join(B)

A %>% anti_join(B) ile A nın B ile eşleşemeyen satırları alınarak yeni veri setinde sadece A dan gelen sütunlara yer verilir.

Şekil 6. anti_join fonksiyonu
Şekil 6. anti_join fonksiyonu

Şekil 6'da, anti_join() fonksiyonu ile öncelikle "ID" değişkeni baz alınarak ortak olmayan satırlar yani sadece 1. satır ve A veri setindeki değişken (X1) alınmıştır.

miniPISA1 %>%  anti_join(miniPISA2) # veri birleştirme
OGR_ID CNSYT ST097Q01TA ST097Q02TA
79201118 1 2 3

Çıktıda miniPISA1 verisinin miniPISA2 verisi ile eşleşmeyen satırları ele alındığından "79201118" id numaralı öğrenci yeni veri setine dahil edilmiştir. Ayrıca yeni veri setinde sadece miniPISA1 değişkeninde yer alan cinsiyet, ST097Q01TA, ST097Q02TA değişkenleri yer almıştır.

Not: Aynı değerleri içeren satırların olduğu sütunların eşleşmesi gerektiğini söyledik. Bunları birleştirme için aslında by = argümanını da kullanılır. Fakat birleştirme yapmak istediğimiz sütun/ların isimleri aynı olduğunda by = argümanını kullanmaya gerek kalmaz. Buraya kadar yapılan örnekler aşağıdaki gibi pipe operatörü kullanılmadan da yapılabilir.

left_join(miniPISA1,miniPISA2, by=join_by(OGR_ID))
OGR_ID CNSYT ST097Q01TA ST097Q02TA O_ZEVK O_OD1
79200768 2 1 2 -0.29 376.02
79201064 2 3 2 0.60 512.32
79201118 1 2 3 NA NA
79201275 2 2 2 -1.15 393.01
79201481 2 3 3 0.67 552.46
79201556 2 3 3 0.36 441.29

Elde edilen çıktı miniPISA1 %>% left_join(miniPISA2) fonksiyonu ile elde edilen çıktı ile aynıdır.