Bu haftaki dersimizide dplyr paketindeki bazı fonksiyonların kullanımına devam ettik. Fonksiyonlara geçmeden hem veri setini yüklemeli , hem de dplyr paketini aktif hale getirmeliyim.

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)
load("D:/OLC_731/Rders/import/PISA_COG_2018.rda")
load("D:/OLC_731/Rders/import/PISA_OGR_2018.rda")
load("D:/OLC_731/Rders/import/PISA_SCH_2018.rda")
load("D:/OLC_731/Rders/import/midiPISA.rda")

Count Fonksiyonu

count fonksiyonu değişkenlerin frekans tablosunu elde etmek için kullanılır.

pipe (%>%) operatöüyle birlikte kullanılır.

midiPISA %>% count() # frekans hesaplanması
## # A tibble: 1 × 1
##       n
##   <int>
## 1  6890

midiPISA veri setinde 6890 adet gözlem olduğu anlaşılmaktadır.

# CINSIYET değişkenine frekans hesaplama
midiPISA %>% count(CINSIYET) 
## # A tibble: 2 × 2
##   CINSIYET      n
##   <dbl+lbl> <int>
## 1 1 [Kiz]    3396
## 2 2 [Erkek]  3494

Cinsiyet değişkenine göre kız öğrencilerin sayısı 3396, erkek öğrencilerin sayısı 3494’tür.

sort argümanıyla birlikte kullandığımızda frekans değerlerini çoktam aza doğru verir.

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

Eğer SINIF ve CİNSİYET değişkenini aynı anda sıralamayla elde etmek istersek aşağıdaki kodu kullanabiliriz.

# CINSIYET ve SINIF değişkenlerine göre dağılımın sıralanması
midiPISA %>% count(CINSIYET,SINIF, sort=TRUE) 
## # A tibble: 12 × 3
##    CINSIYET  SINIF             n
##    <dbl+lbl> <dbl+lbl>     <int>
##  1 1 [Kiz]   10 [SINIF 10]  2707
##  2 2 [Erkek] 10 [SINIF 10]  2653
##  3 2 [Erkek]  9 [SINIF 9]    747
##  4 1 [Kiz]    9 [SINIF 9]    548
##  5 1 [Kiz]   11 [SINIF 11]   124
##  6 2 [Erkek] 11 [SINIF 11]    83
##  7 1 [Kiz]    8 [SINIF 8]     11
##  8 2 [Erkek]  8 [SINIF 8]      8
##  9 1 [Kiz]   12 [SINIF 12]     5
## 10 2 [Erkek]  7 [SINIF 7]      2
## 11 1 [Kiz]    7 [SINIF 7]      1
## 12 2 [Erkek] 12 [SINIF 12]     1

Belirli bir değişkene ilişkin toplam almak istenirse count() fonksiyonunun wt() argümanını kullanabiliriz.

# CINSIYET değişkenine göre gruplandırılmış veride SINIF değişkenine göre toplam frekans sayısı
midiPISA %>% count(SINIF, wt=CINSIYET, sort=TRUE)
## # A tibble: 6 × 2
##   SINIF             n
##   <dbl+lbl>     <dbl>
## 1 10 [SINIF 10]  8013
## 2  9 [SINIF 9]   2042
## 3 11 [SINIF 11]   290
## 4  8 [SINIF 8]     27
## 5 12 [SINIF 12]     7
## 6  7 [SINIF 7]      5

Örneğin, 11 sınıflarda toplam 290 öğrenci verisine sahibiz denebilir.

Summarise/ Summarize Fonksiyonu

summarise fonksiyonu tek satırda veri setini özetler ve yeni bir veri seti oluşturur.

midiPISA %>% 
summarise(mean(ODOKUMA1)) #ortalamanın hesaplanması
## # A tibble: 1 × 1
##   `mean(ODOKUMA1)`
##              <dbl>
## 1             464.

Bu veri setindeki ojuma puanalrının ortalamasının 464.2299 olduğunu söyleyebiliriz. Eğer veri setine dair daha fazla özetleyici biligiye ulaşmak istersek argümanlar arasında virgül koyarak aşağıdaki gibi hesaplama yapabiliriz.

midiPISA %>%
  summarise(n = n(),  
            ortalama=mean(ODOKUMA1),  
            sd=sd(ODOKUMA1),
            min=min(ODOKUMA1),
            max=max(ODOKUMA1))
## # A tibble: 1 × 5
##       n ortalama    sd   min   max
##   <int>    <dbl> <dbl> <dbl> <dbl>
## 1  6890     464.  87.8  176.  772.

Summarise ve Group_by Fonksiyonu

Veri setinde yer alan alt gruplar için istatiksel çıktılara ulaşmak için group_by kullanabiliriz.

midiPISA %>%
  group_by(CINSIYET) %>%
  summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1),min=min(ODOKUMA1),max=max(ODOKUMA1)) 
## # A tibble: 2 × 6
##   CINSIYET      n ortalama    sd   min   max
##   <dbl+lbl> <int>    <dbl> <dbl> <dbl> <dbl>
## 1 1 [Kiz]    3396     478.  83.7  236.  772.
## 2 2 [Erkek]  3494     451.  89.6  176.  747.

Cinsiyet değişkenine göre ortalama, standart sapma, min ve max değerler tablodan okunabilir.

Bu istatistiki verileri iki tane kategorik değişken için de hesaplayabiliriz. Cinsiyet ve sınıf düzeyi kategorik değişlnlerine göre çıktılara aşağıdaki gibi ulaşabiliriz.

betimsel <- midiPISA%>%  # betimsel veri nesnesine atama
# CINSIYET ve SINIF değişkenlerine göre gruplara ayırma
  group_by(CINSIYET,SINIF) %>%  
# özetleyici bilgileri hesaplama
  summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1)) %>%  
# gözlemleri ortalama değerleri büyükten küçüğe olacak şekilde sıralama
  arrange(desc(ortalama)) 
## `summarise()` has grouped output by 'CINSIYET'. You can override using the
## `.groups` argument.
head(betimsel)
## # A tibble: 6 × 5
## # Groups:   CINSIYET [2]
##   CINSIYET  SINIF             n ortalama    sd
##   <dbl+lbl> <dbl+lbl>     <int>    <dbl> <dbl>
## 1 1 [Kiz]   10 [SINIF 10]  2707     482.  79.9
## 2 1 [Kiz]   11 [SINIF 11]   124     473.  85.0
## 3 1 [Kiz]    9 [SINIF 9]    548     462.  96.9
## 4 2 [Erkek] 10 [SINIF 10]  2653     459.  85.0
## 5 2 [Erkek] 11 [SINIF 11]    83     448.  87.9
## 6 2 [Erkek]  9 [SINIF 9]    747     422.  98.7

En yüksek ortalamaya 10.sınıflardaki kız öğrenciler sahiptir denilebilir. (482.2966)

Summarise ve Across Fonksiyonu

summarise ve across fonksiyonlarını birlikte kullanarak summarise_at(),summarise_all() ve summarise_if()işlevlerinin aynısını yerine getirebiliriz.

midiPISA %>%
  summarise(across(everything(), list(mean = mean, sd = sd),na.rm=TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(everything(), 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>, …

Bu çıktıda her değişekndeki eksik veriler silinerek ortalamalarının alındığını görülmektedir.

Top_n Fonksiyonu

Bir değişkenin en yüksek ya da en düşük değerini bulmak için kullanabiliriz.

df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1))
df %>% top_n(2)
## Selecting by x
##    x
## 1 10
## 2  6

Okuma puanoı en yüksek 5 kız ve 5 erkek öğrenciye ait bilgiler aşağıdaki gibidir.

midiPISA %>%
  # CINSIYET ve okuma olası değer1 değişkenlerinin seçilmesi
  select(CINSIYET,ODOKUMA1)%>% 
  # büyükten küçüğe okuma puanlarının sıralanması
  arrange(desc(ODOKUMA1))%>% 
  # CINSIYET değişkenine göre verinin gruplandırılması
  group_by(CINSIYET) %>%  
  # okuma puanına göre her kategoriye ait en yüksek 5'er öğrencinin görüntülenmesi
  top_n(5,ODOKUMA1) 
## # A tibble: 10 × 2
## # Groups:   CINSIYET [2]
##    CINSIYET  ODOKUMA1
##    <dbl+lbl>    <dbl>
##  1 1 [Kiz]       772.
##  2 1 [Kiz]       748.
##  3 2 [Erkek]     747.
##  4 1 [Kiz]       743.
##  5 2 [Erkek]     737.
##  6 1 [Kiz]       719.
##  7 1 [Kiz]       715.
##  8 2 [Erkek]     714.
##  9 2 [Erkek]     713.
## 10 2 [Erkek]     707.

Bu fonksiyon ‘-’ işaretiyle kullanıldığında veri setindeki en düşük değere sahip öğrencilerin özelliklerini gösteririr. Örneğin, okuma puanı en düşük 5 erkek ve 5 kız öğrencinin bilgileri aşağadaki gibidir.

midiPISA %>%
  select(CINSIYET,ODOKUMA1)%>% 
  arrange(desc(ODOKUMA1))%>% 
  group_by(CINSIYET) %>% 
  # okuma puanına göre her kategoriye ait en düşük 5'er öğrencinin görüntülenmesi
  top_n(-5,ODOKUMA1) 
## # A tibble: 10 × 2
## # Groups:   CINSIYET [2]
##    CINSIYET  ODOKUMA1
##    <dbl+lbl>    <dbl>
##  1 1 [Kiz]       254.
##  2 1 [Kiz]       253.
##  3 1 [Kiz]       250.
##  4 1 [Kiz]       242.
##  5 1 [Kiz]       236.
##  6 2 [Erkek]     220.
##  7 2 [Erkek]     211.
##  8 2 [Erkek]     199.
##  9 2 [Erkek]     177.
## 10 2 [Erkek]     176.

Join Fonksiyonu

left_join(), right_join(), full_join(), inner_join(), semi_join(), anti_join() gibi farklı kullanımları olan bu fonksiyon temelde iki veri setini istenilen şekilde birleştirme amacıyla kullanılır.

left_join() ile ilgili aşağıdaki uygulama yapılmıştır.

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+lbl> <dbl+lbl>                <dbl+lbl>               
## 1  79200768 2 [Erkek] 1 [Her ders]             2 [Derslerin cogunda]   
## 2  79201064 2 [Erkek] 3 [cogunlukla test dili] 2 [Derslerin cogunda]   
## 3  79201118 1 [Kiz]   2 [Derslerin cogunda]    3 [cogunlukla test dili]
## 4  79201275 2 [Erkek] 2 [Derslerin cogunda]    2 [Derslerin cogunda]   
## 5  79201481 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunlukla test dili]
## 6  79201556 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunlukla test dili]
#değişkenlerin seçimi
midiPISA2<- midiPISA %>% select(OGRENCIID,OKUMA_ZEVK,ODOKUMA1) 
midiPISA2<-midiPISA2[1:7,] #veri setinin ilk 7 satırının seçilmesi
midiPISA2<-midiPISA2[-3,] #veri setinin 3. satırının çıkarılması
midiPISA2
## # A tibble: 6 × 3
##   OGRENCIID OKUMA_ZEVK ODOKUMA1
##       <dbl>      <dbl>    <dbl>
## 1  79200768    -0.289      376.
## 2  79201064     0.604      512.
## 3  79201275    -1.15       393.
## 4  79201481     0.667      552.
## 5  79201556     0.357      441.
## 6  79201652    -0.0886     411.

right_join() ile ilgili aşağıdaki uygulama yapılmıştır.

midiPISA1%>% right_join(midiPISA2) # veri birleştirme
## Joining with `by = join_by(OGRENCIID)`
## # A tibble: 6 × 6
##   OGRENCIID CINSIYET   ST097Q01TA                ST097Q02TA  OKUMA_ZEVK ODOKUMA1
##       <dbl> <dbl+lbl>  <dbl+lbl>                 <dbl+lbl>        <dbl>    <dbl>
## 1  79200768  2 [Erkek]  1 [Her ders]              2 [Dersle…    -0.289      376.
## 2  79201064  2 [Erkek]  3 [cogunlukla test dili]  2 [Dersle…     0.604      512.
## 3  79201275  2 [Erkek]  2 [Derslerin cogunda]     2 [Dersle…    -1.15       393.
## 4  79201481  2 [Erkek]  3 [cogunlukla test dili]  3 [cogunl…     0.667      552.
## 5  79201556  2 [Erkek]  3 [cogunlukla test dili]  3 [cogunl…     0.357      441.
## 6  79201652 NA         NA                        NA             -0.0886     411.

Gather Fonksiyonu

Fonksiyonun kullanımı içn aşağıda bir örnek yapabiliriz.

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.

gather() fonksiyonuyla geniş veriyi uzun veri haline getirebiliriz.

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.

Spread Fonksiyonu

gather() fonksiyonunun işlevinin tam tersini yapar. Uzun olan veriyi yeniden geniş hale getirir.

tekrar_genis <- uzun %>% spread(O_OD,okumapuan) # geniş veri oluşturulması
tekrar_genis %>% head(6) # ilk altı satırın görüntülenmesi
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200001     450.     458.     413.     430.     439.
## 2  79200002     669.     666.     685.     665.     660.
## 3  79200003     452.     502.     444.     456.     437.
## 4  79200004     347.     317.     339.     325.     367.
## 5  79200005     467.     498.     415.     471.     446.
## 6  79200006     366.     364.     384.     420.     351.

Pivot_Longer ve Pivot_Wider Fonksiyonları

midiPISA verisetinden daha az değişken içerecek şekilde bir geniş veri seti örneği oluşturabiliriz.

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.

pivot_longer fonksiyonu geniş veriyi, uzun veri haline getirebilir.

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.

Bir veri setini daha iyi yorumlamak için geniş halde olmasısını tercih ederiz. Bunu da pivot_wider fonksiyonuyla yapabiliriz.

genis<- uzun %>% pivot_wider(names_from="okumapuan",values_from="deger")
genis %>% head(5)
## # A tibble: 5 × 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.

Seperate Fonksiyonu

Bu fonksiyonu bir sütunu birden fazla sütuna bölmek için kullnabiliriz.

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.

Unıte Fonksiyonu

seperate fonksiyonun işlevinin tersini yapar.

uzun_birles <- uzun_v1 %>% unite(ODOKUMA, OD, Sayi, sep = "_") # sütun birleştirmenin yapılması
uzun_birles %>% head(3) # ilk üç satırın görüntülenmesi
## # A tibble: 3 × 3
##   OGRENCIID ODOKUMA deger
##       <dbl> <chr>   <dbl>
## 1  79200768 ODOKU_1  376.
## 2  79200768 ODOKU_2  418.
## 3  79200768 ODOKU_3  421.