• 13 Kasım tarihli R ile Veri Analizi dersimizde, veri düzenleme ve işleme konusunda birçok dplyr fonksiyonunu ele aldık.
  • Bu fonksiyonların, veri setlerini düzenlemek, özetlemek ve analiz etmek için oldukça faydalı olduğunu düşünüyorum.
  • Bu yansıma yazısında, her bir fonksiyonu kısaca özetleyecek ve kullanım örnekleri sunacağım.
  • Öncelikle bir önceki derste kullanılan veri setlerini burada da kullanacağım için gerekli paketlerin ve veri setlerinin yüklenmesi gerekiyor. Yükleme için aşağıdaki kodları kullandım.

Paketleri yükleme

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(tibble)  
library(haven)

Veri setlerini yükleme

load("C:/Users/Lenovo/Desktop/R/data/PISA_COG_2018.rda")
load("C:/Users/Lenovo/Desktop/R/data/PISA_OGR_2018.rda")
load("C:/Users/Lenovo/Desktop/R/data/PISA_SCH_2018.rda")

midiPISA veri setini yükleme

# Veri setini yükleme
load("C:/Users/Lenovo/Desktop/R/data/midiPISA.rda")

1. count()

count() fonksiyonu, frekans tablosu oluşturmak için kullanılır. Genellikle pipe operatörü (%>%) ile birlikte veri işleme adımlarında sıkça kullanılır. Bu fonksiyon belirli bir değişkene göre gözlem sayısını hesaplayabilir.

# `CINSIYET` değişkenine göre sayım yapmak
midiPISA %>% count(CINSIYET)
## # A tibble: 2 × 2
##   CINSIYET      n
##   <dbl+lbl> <int>
## 1 1 [Kiz]    3396
## 2 2 [Erkek]  3494
# Sayım sonucunu frekansa göre sıralamak
midiPISA %>% count(CINSIYET, sort = TRUE)
## # A tibble: 2 × 2
##   CINSIYET      n
##   <dbl+lbl> <int>
## 1 2 [Erkek]  3494
## 2 1 [Kiz]    3396

Bu örnekte, CINSIYET değişkenine göre dağılım incelenmiştir. Sıralama yaparak en yaygın kategorileri hızlıca görebiliyoruz.

2. summarise()

Summarise() fonksiyonu, belirli bir sütun için özet istatistikler hesaplar (örneğinmean(), min(), max()). Özellikle veri setinde hızlıca özet bilgi almak için çok kullanışlıdır.

# `ODOKUMA1` değişkeninin ortalamasını hesaplama
midiPISA %>%
  summarise(mean = mean(ODOKUMA1))
## # A tibble: 1 × 1
##    mean
##   <dbl>
## 1  464.
# Ortalamayı `ortalama` sütun adı ile isimlendirme
midiPISA %>%
  summarise(ortalama = mean(ODOKUMA1))
## # A tibble: 1 × 1
##   ortalama
##      <dbl>
## 1     464.

Bu örnekte ODOKUMA1 değişkeninin ortalaması hesaplanmıştır. Kolonları isimlendirme özelliği, çıktıların daha anlaşılır olmasını sağlar.

3. summarise() ve group_by()

Summarise() ve group_by() birlikte kullanıldığında, veri alt gruplarına göre özet istatistikler elde edilebilir.
Örneğin, CINSIYET değişkenine göre gruplandırarak her bir grup için özet istatistikler hesaplanabilir.

# Cinsiyete göre okuma puanlarının özetlenmesi
midiPISA %>%
  group_by(CINSIYET) %>%
  summarise(mean = mean(ODOKUMA1), sd = sd(ODOKUMA1), min = min(ODOKUMA1), max = max(ODOKUMA1))
## # A tibble: 2 × 5
##   CINSIYET   mean    sd   min   max
##   <dbl+lbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 [Kiz]    478.  83.7  236.  772.
## 2 2 [Erkek]  451.  89.6  176.  747.

Bu örnek, gruplandırılmış özetler ile erkek ve kız öğrencilerin ortalama, standart sapma, minimum ve maksimum puanlarını karşılaştırmamızı sağlar.

4. across()

across() fonksiyonu, aynı anda birden fazla sütun üzerinde işlem yapmak için kullanılır.
Genellikle summarise() ve mutate() içinde kullanılarak işlemleri topluca yapmak kolaylaşır.

# Birden fazla sütun için ortalama ve standart sapma hesaplama
midiPISA %>%
  summarise(across(starts_with("OD"), list(mean = mean, sd = sd)))
## # A tibble: 1 × 10
##   ODOKUMA1_mean ODOKUMA1_sd ODOKUMA2_mean ODOKUMA2_sd ODOKUMA3_mean ODOKUMA3_sd
##           <dbl>       <dbl>         <dbl>       <dbl>         <dbl>       <dbl>
## 1          464.        87.8          464.        87.7          465.        87.1
## # ℹ 4 more variables: ODOKUMA4_mean <dbl>, ODOKUMA4_sd <dbl>,
## #   ODOKUMA5_mean <dbl>, ODOKUMA5_sd <dbl>

Bu örnekte, across() kullanılarak “OD” ile başlayan tüm sütunlar için hem ortalama hem de standart sapma hesaplanmıştır.

NOT

Önceden summarise_at(), summarise_if(), summarise_all() gibi fonksiyonlar kullanılırken, artık across() bu işlevlerin yerini almıştır.

# haven_labelled sütunları numeric tipe dönüştürme
midiPISA <- midiPISA %>%
  mutate(across(where(~ inherits(., "haven_labelled")), as.numeric))

# Ardından, across() işlemini uygulama
midiPISA %>%
  summarise(
    across(
      where(is.numeric), 
      list(mean = ~ mean(., na.rm = TRUE), sd = ~ sd(., na.rm = TRUE))
    )
  )
## # A tibble: 1 × 32
##   OGRENCIID_mean OGRENCIID_sd SINIF_mean SINIF_sd CINSIYET_mean CINSIYET_sd
##            <dbl>        <dbl>      <dbl>    <dbl>         <dbl>       <dbl>
## 1      79203623.        2087.       9.84    0.458          1.51       0.500
## # ℹ 26 more variables: Anne_Egitim_mean <dbl>, Anne_Egitim_sd <dbl>,
## #   Baba_Egitim_mean <dbl>, Baba_Egitim_sd <dbl>, OKUMA_ZEVK_mean <dbl>,
## #   OKUMA_ZEVK_sd <dbl>, ST097Q01TA_mean <dbl>, ST097Q01TA_sd <dbl>,
## #   ST097Q02TA_mean <dbl>, ST097Q02TA_sd <dbl>, ST097Q03TA_mean <dbl>,
## #   ST097Q03TA_sd <dbl>, ST097Q04TA_mean <dbl>, ST097Q04TA_sd <dbl>,
## #   ST097Q05TA_mean <dbl>, ST097Q05TA_sd <dbl>, ODOKUMA1_mean <dbl>,
## #   ODOKUMA1_sd <dbl>, ODOKUMA2_mean <dbl>, ODOKUMA2_sd <dbl>, …
# Sayısal değişkenlerin ortalama ve standart sapmalarını hesaplama
midiPISA %>%
  summarise(across(where(is.numeric), list(mean = mean, sd = sd), na.rm = TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(where(is.numeric), list(mean = mean, sd = sd), na.rm =
##   TRUE)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
## 
##   # Previously
##   across(a:b, mean, na.rm = TRUE)
## 
##   # Now
##   across(a:b, \(x) mean(x, na.rm = TRUE))
## # A tibble: 1 × 32
##   OGRENCIID_mean OGRENCIID_sd SINIF_mean SINIF_sd CINSIYET_mean CINSIYET_sd
##            <dbl>        <dbl>      <dbl>    <dbl>         <dbl>       <dbl>
## 1      79203623.        2087.       9.84    0.458          1.51       0.500
## # ℹ 26 more variables: Anne_Egitim_mean <dbl>, Anne_Egitim_sd <dbl>,
## #   Baba_Egitim_mean <dbl>, Baba_Egitim_sd <dbl>, OKUMA_ZEVK_mean <dbl>,
## #   OKUMA_ZEVK_sd <dbl>, ST097Q01TA_mean <dbl>, ST097Q01TA_sd <dbl>,
## #   ST097Q02TA_mean <dbl>, ST097Q02TA_sd <dbl>, ST097Q03TA_mean <dbl>,
## #   ST097Q03TA_sd <dbl>, ST097Q04TA_mean <dbl>, ST097Q04TA_sd <dbl>,
## #   ST097Q05TA_mean <dbl>, ST097Q05TA_sd <dbl>, ODOKUMA1_mean <dbl>,
## #   ODOKUMA1_sd <dbl>, ODOKUMA2_mean <dbl>, ODOKUMA2_sd <dbl>, …

Across() ile çalışmak, modern ve sade bir yaklaşım sunarak dplyr’ın basitlik ve esneklik ilkelerine uyum sağlar.

5. top_n()

top_n() fonksiyonu, belirli bir değişkenin en yüksek veya en düşük değerlerine göre satırları seçmemize olanak tanır.
Örneğin, en yüksek performans gösteren öğrencileri bulmak için kullanılabilir.

# En yüksek okuma puanına sahip ilk 5 öğrenci (her bir cinsiyet için)
midiPISA %>%
  group_by(CINSIYET) %>%
  top_n(5, ODOKUMA1)
## # A tibble: 10 × 16
## # Groups:   CINSIYET [2]
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79200826    10        1           6           6      2.61           3
##  2  79201125    10        2           5           5      0.370          4
##  3  79207038     9        2           6           6      2.61           3
##  4  79202197    10        1           6           6      0.638          3
##  5  79200887     9        1           6           6      2.08           3
##  6  79205833     9        2           4           6      2.61           4
##  7  79201373    10        1           6           6      1.33           4
##  8  79200072    10        2           4           4      1.60           4
##  9  79200920    10        2           5           6      0.201          4
## 10  79202969    10        1           6           6      2.08           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Bu örnekte, her cinsiyetten en yüksek 5 okuma puanı sıralanarak görüntülenmiştir.

6. top_n() ve -

Negatif bir değerle top_n() kullanımı, en düşük değerlere göre sıralama yapar ve belirli bir sayıda en düşük gözlemi seçer.

# En düşük okuma puanına sahip ilk 5 öğrenci (her bir cinsiyet için)
midiPISA %>%
  group_by(CINSIYET) %>%
  top_n(-5, ODOKUMA1)
## # A tibble: 10 × 16
## # Groups:   CINSIYET [2]
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79203445    10        2           6           1    -0.0738          1
##  2  79202889     9        2           1           2    -0.412           3
##  3  79202924     9        2           6           6    NA               3
##  4  79204366     9        1           2           2     0.638           4
##  5  79200572    11        1           2           2     0.557           4
##  6  79203329     9        2           2           2     0.0127          1
##  7  79206761    10        1           1           2     0.852           1
##  8  79201699    10        1           5           5     0.182           3
##  9  79201615     9        1           2          NA    NA               3
## 10  79201966    10        2           6           6    -0.116           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Bu örnek, en düşük performans gösteren öğrencileri belirlemek için negatif sıralama kullanmanın faydasını gösterir.

7. join()

dplyr paketinde left_join(), right_join(), inner_join(), full_join(), semi_join(), ve anti_join() gibi fonksiyonlar iki veri setini birleştirmek için kullanılır.
Bu fonksiyonlar, veri setlerinin anahtar değişkenlerine göre eşleşen veya eşleşmeyen satırları belirlememize olanak tanır.

left_join örneği:

midiPISA1 <- midiPISA %>% select(OGRENCIID,CINSIYET,ST097Q01TA,ST097Q02TA) #değişkenlerin seçimi
midiPISA1<-midiPISA1[1:6,] #veri setinin ilk 6 satırının seçilmesi
midiPISA1
## # A tibble: 6 × 4
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA
##       <dbl>    <dbl>      <dbl>      <dbl>
## 1  79200768        2          1          2
## 2  79201064        2          3          2
## 3  79201118        1          2          3
## 4  79201275        2          2          2
## 5  79201481        2          3          3
## 6  79201556        2          3          3

inner_join örneği

Önce midiPISA2 oluşturulur.

#değişkenlerin seçimi
midiPISA2<- midiPISA %>% select(OGRENCIID,OKUMA_ZEVK,ODOKUMA1) 
midiPISA2<-midiPISA2[1:6,] #veri setinin ilk 6 satırının seçilmesi
midiPISA2<-midiPISA2[-2,] #veri setinin 2. satırının çıkarılması
midiPISA2
## # A tibble: 5 × 3
##   OGRENCIID OKUMA_ZEVK ODOKUMA1
##       <dbl>      <dbl>    <dbl>
## 1  79200768     -0.289     376.
## 2  79201118      0.638     396.
## 3  79201275     -1.15      393.
## 4  79201481      0.667     552.
## 5  79201556      0.357     441.
midiPISA1%>% inner_join(midiPISA2) # veri birleştirme
## Joining with `by = join_by(OGRENCIID)`
## # A tibble: 5 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2     -0.289     376.
## 2  79201118        1          2          3      0.638     396.
## 3  79201275        2          2          2     -1.15      393.
## 4  79201481        2          3          3      0.667     552.
## 5  79201556        2          3          3      0.357     441.

Her join türü, veri setleri arasında esnek bir şekilde ilişki kurmamızı sağlar.

8. gather() ve spread()

gather() fonksiyonu geniş formatlı veriyi uzun formata çevirirken, spread() fonksiyonu tam tersini yapar. Bu dönüşüm, veriyi temizleme ve hazırlamada önemlidir.

genisveri<- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200768     376.     418.     421.     414.     434.
## 2  79201064     512.     473.     564.     485.     500.
## 3  79201118     396.     414.     423.     452.     392.
## 4  79201275     393.     429.     365.     383.     379.
## 5  79201481     552.     570.     563.     531.     532.
## 6  79201556     441.     416.     407.     437.     473.
uzun <- genisveri %>% gather(O_OD,okumapuan,ODOKUMA1:ODOKUMA5)
## Warning: attributes are not identical across measure variables; they will be
## dropped
uzun %>%  arrange(OGRENCIID) %>% head(10)
## # A tibble: 10 × 3
##    OGRENCIID O_OD     okumapuan
##        <dbl> <chr>        <dbl>
##  1  79200001 ODOKUMA1      450.
##  2  79200001 ODOKUMA2      458.
##  3  79200001 ODOKUMA3      413.
##  4  79200001 ODOKUMA4      430.
##  5  79200001 ODOKUMA5      439.
##  6  79200002 ODOKUMA1      669.
##  7  79200002 ODOKUMA2      666.
##  8  79200002 ODOKUMA3      685.
##  9  79200002 ODOKUMA4      665.
## 10  79200002 ODOKUMA5      660.

Bu pivot fonksiyonları, veri görselleştirme veya analiz için veriyi hazırlamada çok değerlidir.

9. pivot_longer() ve pivot_wider()

gather() ve spread() fonksiyonlarına alternatif olarak pivot_longer() ve pivot_wider() bize esneklik sunar.

genisveri <- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200768     376.     418.     421.     414.     434.
## 2  79201064     512.     473.     564.     485.     500.
## 3  79201118     396.     414.     423.     452.     392.
## 4  79201275     393.     429.     365.     383.     379.
## 5  79201481     552.     570.     563.     531.     532.
## 6  79201556     441.     416.     407.     437.     473.
uzun <- genisveri %>% pivot_longer(names_to="okumapuan",values_to="deger",cols=ODOKUMA1:ODOKUMA5)
uzun %>% head(5)
## # A tibble: 5 × 3
##   OGRENCIID okumapuan deger
##       <dbl> <chr>     <dbl>
## 1  79200768 ODOKUMA1   376.
## 2  79200768 ODOKUMA2   418.
## 3  79200768 ODOKUMA3   421.
## 4  79200768 ODOKUMA4   414.
## 5  79200768 ODOKUMA5   434.

Bu fonksiyonlar, veriyi düzenli hale getirmede ve analiz öncesi düzenlemelerde büyük kolaylık sağlar.

10. separate()

separate() fonksiyonu, bir sütunu birden fazla sütuna ayırır. Bu özellik, değerlerin bir sütunda birleştirildiği durumlarda faydalıdır.

uzun_v1 <- uzun %>% separate(okumapuan, c("OD","Sayi"),"MA") # bir sütunu iki sütuna ayırma

uzun_v1 %>% head(3) #ilk üç satırın görüntülenmesi
## # A tibble: 3 × 4
##   OGRENCIID OD    Sayi  deger
##       <dbl> <chr> <chr> <dbl>
## 1  79200768 ODOKU 1      376.
## 2  79200768 ODOKU 2      418.
## 3  79200768 ODOKU 3      421.

Bu işlem, karmaşık sütun değerlerini anlamlı parçalara ayırmamıza yardımcı olur.

11. unite()

unite() fonksiyonu separate() işleminin tersini yapar; iki veya daha fazla sütunu birleştirir.

# İki sütunu birleştirerek tek bir kimlik oluşturma
uzun_v1 %>% unite("ODOKUMA", OD, Sayi, sep = "_")
## # A tibble: 34,450 × 3
##    OGRENCIID ODOKUMA deger
##        <dbl> <chr>   <dbl>
##  1  79200768 ODOKU_1  376.
##  2  79200768 ODOKU_2  418.
##  3  79200768 ODOKU_3  421.
##  4  79200768 ODOKU_4  414.
##  5  79200768 ODOKU_5  434.
##  6  79201064 ODOKU_1  512.
##  7  79201064 ODOKU_2  473.
##  8  79201064 ODOKU_3  564.
##  9  79201064 ODOKU_4  485.
## 10  79201064 ODOKU_5  500.
## # ℹ 34,440 more rows

Unite() fonksiyonu, özellikle tanımlayıcı birleşik sütunlar oluşturmak için yararlıdır.

. Sonuç olarak, bu derste ele alınan fonksiyonlar R dilinde veri düzenleme ve analizinde temel araçlardır.
. Her bir fonksiyon, veriyi hızlı ve verimli bir şekilde düzenlememize olanak tanır.
. R’de veri manipülasyonu tekniklerini öğrenmek, verinin analiz ve görselleştirme süreçlerinde daha etkin kullanılmasını sağlayacaktır.