R'da dplyr Eğitimi: Örneklerle Verileri Birleştirme ve Birleştirme
⚡ Akıllı Özet
dplyr, R'da veri çerçevelerini dört fiil kullanarak birleştirir ve ekler: left_join(), right_join(), inner_join() ve full_join(). Eşlik eden paket tidyr ise birleştirilmiş sonucu gather(), spread(), separate() ve unite() işlevlerini kullanarak yeniden şekillendirir.

Veri Analizine Giriş
Herhangi bir birleşme veya yeniden şekillendirme işleminden önceping Fiil mantıklı geliyor, veri manipülasyonunun nereye uyduğunu görmeye yardımcı oluyor. Veri analizi Üç bölüme ayrılabilir:
- Extracyon: Öncelikle birçok kaynaktan veri toplayıp birleştirmemiz gerekiyor.
- Dönüştürmek: Bu adım veri manipülasyonunu içerir. Tüm veri kaynaklarını birleştirdikten sonra verileri temizlemeye başlayabiliriz.
- Görselleştirin: Son hamle, düzensizliği kontrol etmek için verilerimizi görselleştirmektir.
Aşağıdaki diyagram üç aşamanın nasıl birbirine bağlandığını göstermektedir.

Veri bilimcilerinin karşılaştığı en önemli zorluklardan biri veri manipülasyonudur. Veriler hiçbir zaman istenilen formatta mevcut değildir. Veri bilimcileri zamanlarının en az yarısını verileri temizlemeye ve manipüle etmeye ayırmak zorundadır. Bu, işin en kritik görevlerinden biridir. Veri manipülasyon süreci eksiksiz, hassas ve titiz değilse, model doğru çalışmaz.
R dplyr
R'da veri dönüştürmeyi sağlayan dplyr adlı bir paket bulunur. Bu paket, filter(), select(), arrange(), mutate() ve summarise() gibi temel fiillerin yanı sıra bir dizi join fonksiyonu etrafında inşa edilmiştir. Veriler uygun hale getirildikten sonra, ggplot2 ile görselleştirilebilir.
dplyr paketini kullanarak nasıl veri manipülasyonu yapacağımızı öğreneceğiz. Veri çerçevesiEğer R henüz kurulu değilse, aşağıdaki adımları izleyin. R ve RStudio kurulum adımlarıArdından install.packages(“dplyr”) komutunu çalıştırın.
Verileri dplyr ile birleştirin
dplyr, veri kümelerini birleştirmenin güzel ve kullanışlı bir yolunu sağlar. Birçok girdi verisi kaynağımız olabilir ve bir noktada bunları birleştirmemiz gerekir. Dplyr ile bir birleştirme, orijinal veri kümesinin sağına değişkenler ekler.
dplyr Katılıyor
Aşağıda, dplyr'de iki veri setini birleştirmek için kullanılan dört önemli birleştirme türü bulunmaktadır. Dördü de aynı argümanları (iki tablo ve anahtar) alır ve yalnızca eşleşmeyen satırların hangilerinin kaldığı konusunda farklılık gösterir:
| İşlev | Hedef | Argümanlar | Birden fazla tuş |
|---|---|---|---|
| sol yönden katılım() | İki veri kümesini birleştirin. Tüm gözlemleri orijin tablosundan tutun | x, y, tarafından = “ID” | x, y, by = c(“ID”, “ID2”) |
| right_join() | İki veri kümesini birleştirin. Hedef tablodaki tüm gözlemleri tut | x, y, tarafından = “ID” | x, y, by = c(“ID”, “ID2”) |
| iç birleşim() | İki veri setini birleştirin. Eşleşmeyen tüm satırları hariç tutun. | x, y, tarafından = “ID” | x, y, by = c(“ID”, “ID2”) |
| tam_join() | İki veri setini birleştirin. Tüm gözlemleri saklayın. | x, y, tarafından = “ID” | x, y, by = c(“ID”, “ID2”) |
Bu dört fiil, sol, sağ, iç ve tam dış birleşimlere karşılık gelir. SQLTemel R, all, all.x ve all.y argümanları aracılığıyla aynı sonuçlara ulaşır. birleştirmek().
Kolay bir örnek üzerinden tüm birleştirme türlerini inceleyeceğiz.
Öncelikle iki veri seti oluşturuyoruz. Tablo 1, ID ve y olmak üzere iki değişken içerirken, Tablo 2 ID ve z değişkenlerini bir araya getiriyor. Her durumda, şunlara ihtiyacımız var: anahtar çifti değişken. Bizim durumumuzda kimlik bizim anahtar Değişken. Fonksiyon, her iki tabloda da aynı değerleri arayacak ve döndürülen değerleri tablo 1'in sağına bağlayacaktır. Aşağıdaki şekilde iki tablo yan yana gösterilmiştir.
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
dplyr left_join()
İki veri setini birleştirmenin en yaygın yolu left_join() fonksiyonunu kullanmaktır. Aşağıdaki resimde, anahtar çiftinin A, B, C ve D satırlarıyla eşleştiği, E ve F'nin ise geride kaldığı gösterilmektedir. left_join() ile, orijinal tablodaki tüm satırları korur ve hedef tabloda anahtar çifti olmayan satırları yok sayarız. Örneğimizde, E değeri tablo 1'de mevcut değildir, bu nedenle bu satır silinir. F değeri orijinal tablodan gelir, bu nedenle left_join() işleminden sonra korunur ve z sütununda NA değerini döndürür.
dplyr left_join() örneği
Aşağıdaki diyagram, left_join() işlemi sırasında neler olduğunu göstermektedir.
left_join(df_primary, df_secondary, by ='ID')
Çıktı:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
İki tabloda da aynı ada sahip bir sütun bulunduğunda, dplyr'nin bunları yukarıda gösterilen .x ve .y sonekleriyle ayırt ettiğini unutmayın.
dplyr sağ birleştirme()
right_join() işlevi tam olarak left_join() gibi çalışır. Tek fark satırın düşmesidir. Hedef veri çerçevesinde mevcut olan E değeri yeni tabloda mevcuttur ve y sütunu için NA değerini alır.
dplyr right_join() örneği
Aşağıdaki diyagram ayna görüntüsünü göstermektedir.
right_join(df_primary, df_secondary, by = 'ID')
Çıktı:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
dplyr inner_join()
Eşleşmeyen gözlemlerin hiçbir faydası olmadığında, bunları geri döndürebiliriz. bir tek mevcut olan satırlar her ikisi de Veri kümeleri. Eksik değerleri ortalama veya medyan ile doldurmak istemediğimiz ve eksiksiz bir veri kümesine ihtiyaç duyduğumuz durumlarda doğru seçim budur.
İşte burada inner_join() fonksiyonu devreye giriyor. Bu fonksiyon, her iki taraftaki eşleşmeyen satırları hariç tutuyor.
dplyr inner_join() örneği
Aşağıdaki diyagram, birleştirme işleminden sonra kalan dört kimliği vurgulamaktadır.
inner_join(df_primary, df_secondary, by ='ID')
Çıktı:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
dplyr full_join()
Son olarak, full_join() fonksiyonu tüm gözlemleri korur ve eksik değerleri NA ile değiştirir.
dplyr full_join() örneği
Aşağıdaki diyagram, birleştirme işleminden sonra her iki tablodan da kalan tüm kimlikleri göstermektedir.
full_join(df_primary, df_secondary, by = 'ID')
Çıktı:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
Çoklu Anahtar çiftleri
Son olarak, veri setimizde birden fazla anahtar bulunabilir. Aşağıdaki veri setini ele alalım; burada yıllar ve müşterinin satın aldığı ürünlerin listesi bulunmaktadır. Aşağıdaki ekran görüntüsü, iki tabloyu ve birlikte bir satırı tanımlayan ID ve yıl sütunlarını göstermektedir.
Eğer iki tabloyu yalnızca ID üzerinden birleştirirsek, her yıl her yılla eşleştirilir ve satır sayısı çok artar. Bu durumu düzeltmek için, her iki veri setinde de bulunan iki anahtar-değer çifti değişkeni kullanabiliriz. Yani, ID ve yıl. Tablo 1 ve tablo 2'yi birleştirmek için aşağıdaki kodu kullanabiliriz:
df_primary <- tribble( ~ID, ~year, ~items, "A", 2015,3, "A", 2016,7, "A", 2017,6, "B", 2015,4, "B", 2016,8, "B", 2017,7, "C", 2015,4, "C", 2016,6, "C", 2017,6) df_secondary <- tribble( ~ID, ~year, ~prices, "A", 2015,9, "A", 2016,8, "A", 2017,12, "B", 2015,13, "B", 2016,14, "B", 2017,6, "C", 2015,15, "C", 2016,15, "C", 2017,13) left_join(df_primary, df_secondary, by = c('ID', 'year'))
Çıktı:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
dplyr 1.1.0 sürümünden (Ocak 2023) itibaren aynı anahtar join_by(ID, year) şeklinde yazılabiliyor ve dplyr artık beklenmedik çoktan çoğa eşleşmeler konusunda uyarı veriyor. dplyr 1.1.0 duyuruya eklendi. açıklar.
R'de Veri Temizleme İşlevleri
Birleştirme işlemi sorunun sadece yarısını çözüyor, çünkü birleştirilmiş tablonun yeniden şekillendirilmesi gerekiyor. Verileri düzenlemek (temizlemek) için dört önemli işlev şunlardır:
| İşlev | Hedef | Argümanlar |
|---|---|---|
| toplamak() | Verileri genişten uzuna dönüştürün | (veri, anahtar, değer, na.rm = YANLIŞ) |
| yaymak() | Verileri uzundan genişe dönüştürün | (veri, anahtar, değer) |
| ayırmak() | Bir değişkeni ikiye ayırın | (veri, sütun, içine, ayırıcı = "", kaldır = TRUE) |
| birleş() | İki değişkeni tek bir değişkende birleştir. | (veri, sütun, konsantrasyon, ayırıcı = “”, kaldır = TRUE) |
Sürüm notu: tidyr 1.0.0 sürümünde gather() ve spread() fonksiyonları pivot_longer() ve pivot_wider() fonksiyonlarıyla, tidyr 1.3.0 sürümünde ise separate() fonksiyonu separate_wider_delim() ailesiyle değiştirildi. Yerini alan fonksiyonlar hala çalışıyor, bu nedenle aşağıdaki her örnek işe yarıyor, ancak yeni kodlar, gösterilen daha yeni aileleri tercih etmelidir. tidyr dönen vinyet.unite() geçerliliğini korur.
Verileri işlemek, temizlemek ve görselleştirmek için tidyverse koleksiyonunun bir parçası olan tidyr paketini kullanıyoruz. Eğer R, Anaconda ile birlikte kurulduysa, paket zaten mevcuttur. https://anaconda.org/r/r-tidyr.
Henüz kurulu değilse, tidyr'i kurmak için aşağıdaki komutu girin:
install.packages("tidyr")
toplamak()
`gather()` fonksiyonunun amacı, verileri geniş (wide) formatından uzun (long) formatına dönüştürmektir.
Sözdizimi
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
Örnek E-posta
Aşağıda, resha kavramını görselleştirebiliriz.ping Genişten uzuna. Çeyrek değişkenlerinin satırlarıyla doldurulacak, "büyüme" adında tek bir sütun oluşturmak istiyoruz. Aşağıdaki şekilde solda geniş tablo, sağda ise yeniden şekillendirilmiş uzun tablo gösterilmektedir.
library(tidyr) # Create a messy dataset messy <- data.frame( country = c("A", "B", "C"), q1_2017 = c(0.03, 0.05, 0.01), q2_2017 = c(0.05, 0.07, 0.02), q3_2017 = c(0.04, 0.05, 0.01), q4_2017 = c(0.03, 0.02, 0.04)) messy
Çıktı:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data
tidier <-messy %>%
gather(quarter, growth, q1_2017:q4_2017)
tidier
Çıktı:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
`gather()` fonksiyonunda, orijinal veri setimizde bir grup değişkeni (ülke) ve anahtar-değer çiftleri bulunduğu için `quarter` ve `growth` olmak üzere iki yeni değişken oluşturuyoruz. Tidyr 1.0.0 ve sonraki sürümlerinde aynı yeniden şekillendirme işlemi `pivot_longer(messy, cols = q1_2017:q4_2017, names_to = “quarter”, values_to = “growth”)` şeklinde yazılır.
yaymak()
spread() fonksiyonu gather() fonksiyonunun tam tersini yapar.
Sözdizimi
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
Örnek E-posta
Spread() fonksiyonunu kullanarak daha düzenli veri setini tekrar dağınık hale getirebiliriz.
# Reshape the data
messy_1 <- tidier %>%
spread(quarter, growth)
messy_1
Çıktı:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
Modern karşılığı pivot_wider(tidier, names_from = quarter, values_from = growth) şeklindedir.
ayırmak()
`separe()` fonksiyonu, bir sütunu bir ayırıcıya göre ikiye ayırır. Bu fonksiyon, değişkenin tarih olduğu durumlarda faydalıdır. Analizimiz ay ve yıla odaklanmayı gerektirebilir ve sütunu iki yeni değişkene ayırmak isteyebiliriz.
Sözdizimi
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
Örnek E-posta
Different() işlevini uygulayarak daha derli toplu veri kümesindeki çeyreği yıldan bölebiliriz.
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
Çıktı:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
birleş()
`unite()` fonksiyonu iki sütunu birleştirerek tek bir sütun oluşturur.
Sözdizimi
unite(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
Örnek E-posta
Yukarıdaki örnekte, çeyreği yıldan ayırdık. Peki ya bunları birleştirmek istersek? Şu kodu kullanırız:
unit_tidier <- separate_tidier %>%
unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)
Çıktı:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
Yeniden şekillendirilen veri çerçevesi, geri kalan bölümlerde ele alınan modelleme adımları için artık hazırdır. R eğitim serisi.







