Giriş

05.11.2024 tarihli R ile veri analizi dersini Veri Düzenleme ve Görşelleştirme / Kübra Atalay Kabasakal & Sebahat Gören kitabından işledik. Pisa veri setleri ile örnek kodların yazıldığı kitap ile devam eden derste R dilinin gerçekten benimle konuştuğunu, istediğini anlatarak bilgisayar üzerinen iletişim kurduğunu düşündüm.

Veri Setlerinin Bilgisayara Yüklenmesi

İlk olarak kitabın kullanımı için önerilen aşağıdaki veri setlerini bilgisayara yükledik (Linke tıklayarak veri setlerini indirebilirsiniz).

Bilişsel veri seti
Okul veri seti
Öğrenci anketi veri seti

İndirmelerde sıklıkla yaşanan ve tekrar karşılaştığımız hata yine dosyanın konumu ile ilgiliydi. Dosyanın bilgisayar üzerindeki yerinin bir çok hatanın kaynağı olduğunu farkettiğimden beri en çok buna dikkat ediyorum. Bu sebeple veri setlerini indirip kullanırken hiç sorun yaşamadım.

Veri Setlerinin R’a Yüklenmesi

Bilgisayara indirdiğimiz veri setlerini yeni bir markdown sayfası açarak aşağıdaki kodları kullanarak programa yükledik.

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")

github üzerinden indirebileceğimiz tuev paketi ile de veri setlerine ulaşabileceğimizi, bu pakette 2021 verilerine kadar yüklü olduğunu öğrendik.

devtools üzerinden paketi yüklemek için kullanılan kod;

devtools::install_github("tuevpaket/tuev")
library("tuev")
data(PISA_COG_2018)
data(PISA_SCH_2018)
data(PISA_OGR_2018)
data("TIMSS19_btmturb7")

Midi Pisa Oluşturma

Midi PISA veri setini oluşturmak için öncelikle dplyr ve pipe operatörünün orijinal paketi olan magrittr paketlerini yükledik.

library(dplyr)
library(magrittr) #pipe operatörü için, bunun orijinal paketi

Sonrasında pipe operatörünü kullanarak select ile istediğimiz değişkenleri seçerek midipisa veri setini oluşturduk.

midiPISA <- PISA_OGR_2018 %>% 
  select(OGRENCIID,SINIF,CINSIYET,
         Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,
         ST097Q01TA:ST097Q05TA,ODOKUMA1:ODOKUMA5)

Mini Pisa Oluşturma

Aynı yöntemleri kullanarak bir de midipisa veri seti oluşturduk.

library(dplyr)
library(magrittr)
miniPISA <- PISA_OGR_2018 %>% 
  select(SINIF, CINSIYET, KITAPSAYISI, SES, 
    Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,OK_YETERLIK,
    Okuloncesi_yil, OKUL_TUR,ODOKUMA1)

Oluşturulan Veri Setlerinin Bilgisayara Yüklenmesi

Bu kısımda önemli olan veri setlerini kaydettiğimiz yoldu. saveRDS komutu ile oluşturduğumuz veri setlerini bilgisayara yükledik.

#library(dplyr)
df_1<-PISA_OGR_2018 %>% 
  select(OKUMA_BAGLILIGI, OKUMA_ZEVK, OK_ZORLUK)
saveRDS(df_1, "C:/Users/Lenovo/Desktop/R/data/PISA_OGR_2018.rds")
df_1<- readRDS("C:/Users/Lenovo/Desktop/R/data/PISA_OGR_2018.rds")

Çalışılacak Veri Setinin R Ortamına Aktarılması

Bu kısımda load() fonksiyonunu kullandık. Parantez içine veriyi kaydettiğimiz dosyanın bilgisayardaki yolunu yazdık.

NOT:Bilgisayarda verinin üzerine gelip sağ tuş tıkladığımızda “save as a path” çıkıyor. Yolu kopyalayıp parantez içine yazdığımızda “/” işaretleri ters geldiği için hata veriyor. Bu sorunu tüm işaretleri ters çevirerek ya da aynısından yanına bir tane daha ekleyerek çözebiliyoruz.

load("C:/Users/Lenovo/Desktop/R/data/midiPISA.rda")

Veri seti büyük olduğu için, ilk altı satırın görüntülenmesini istedik. Bunun için head() fonksiyonunu kullandık.

head(miniPISA) 

Ardından veri seti üzerinde çalışabilmek için tidyverse paketini aktifleştirdik. “midipisa” veri setini yeniden yükleyip düzgün görüntülenmesini sağlamak için expss paketini kullandık. Bu sayede değişken etiketlerininden kurtulduk ve veri setinin görünümünde karşılaştığımız hatalardan kurtulduk. Kodlar aşağıda verilmiştir.

library(tidyverse) # paketin aktifleştirilmesi
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
load("C:/Users/Lenovo/Desktop/R/data/midiPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
midiPISA<- expss::drop_var_labs(midiPISA) # değişken etiketlerinin atılması

Bu işlemin bir diğer alternatifinin değişken etiketlerini faktör düzeyi olarak kaydetmek olduğunu öğrendik. Bu işlem aşağıdaki kodlarla sağlanabilir.

library(sjlabelled)
midiPISA <- midiPISA %>% mutate_if(is_labelled, as_factor)
# Faktor degiskenlere duzey atama amacıyla yazılan fonksiyon
levelsnames <- function(x){
  levels(x) <- names(attr(x,"labels"))
  x
}
# Yazılan fonkisyonun faktor degiskenlere uygulanması
midiPISA <-mutate_if(midiPISA,is.factor, levelsnames)
miniPISA <-mutate_if(miniPISA,is.factor, levelsnames)
#library(tidyverse) # paketin aktifleştirilmesi
#load("C:/Users/Lenovo/Desktop/R/data/midiPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
midiPISA<- expss::drop_var_labs(midiPISA)
miniPISA<- expss::drop_var_labs(miniPISA)# değişken etiketlerinin atılması
head(midiPISA)
head(miniPISA
     )

Pipe Operatörü Kullanımı

%>% solundaki nesneye sağındaki fonksiyonu uygular. Yani pipe operatörünün solundaki öğeler, sağındaki fonksiyonun ilk argümanına iletilir. Fonksiyon ilk argümanı olan veriyi, pipe operatörünün solundan alır, kalan argümanlar fonksiyonun sağındadır. Yukarıda da belirttiğim gibi magrittr paketini bu sebeple aktifleştirdik.

Filter Fonksiyonu Kullanımı

Satır bazında veri seçim işlemi yapmak amacıyla filter() fonksiyonunu kullandık. Böylece veri setindeki istenilen değişkenler filtrelenerek sadece bu gözlemlerden oluşan yeni bir veri seti elde edebildik. Örneğin sadece 9. sınıf verilerini görmek için;

midiPISA %>%
 filter(SINIF==9)
head(5)

9 veya 10. sınıf verilerini görmek için ise veya kullandık.

midiPISA %>%
 filter(SINIF==9|10)
head(10)

NOT: Burada veyadan sonra tekrar sınıf==10 yazmama gerek kalmadı. sadece “10” yazarak da kodun çalıştığını fark ettim.

NOT2: head veriler uzun olduğu için buraya da eklenmiştir.

Filter kullanarak cinsiyete göre verileri seçebilmeyi ve bir değişken olarak kaydetmeyi öğrendim.

kiz <- filter(midiPISA, CINSIYET ==1)
erkek<- filter(midiPISA, CINSIYET==2)
kiz
## # A tibble: 3,396 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79201118    10        1           1           2     0.638           2
##  2  79201652    10        1           5           5    -0.0886          3
##  3  79202179    10        1           1           4     1.22            3
##  4  79202313    10        1           1           5     1.58            4
##  5  79202360    10        1           4           1     1.60            2
##  6  79203125     9        1           5           5     1.38            3
##  7  79203300     9        1           4           4     2.61            3
##  8  79203515    10        1           3           4    -1.74            4
##  9  79203553    10        1           6           5     1.19            4
## 10  79203783    10        1           5           5    -0.0254          2
## # ℹ 3,386 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
erkek
## # A tibble: 3,494 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79200768    10        2           2           2     -0.289          1
##  2  79201064    10        2           2           2      0.604          3
##  3  79201275     9        2           6           6     -1.15           2
##  4  79201481     9        2           4           4      0.667          3
##  5  79201556    10        2           4           6      0.357          3
##  6  79202033    10        2           5           5      0.931          3
##  7  79202278    10        2           0           2      0.425          3
##  8  79202343    11        2           6           6     -0.112          1
##  9  79202354     9        2           4           4     -1.13           1
## 10  79202395     9        2           2           4      1.01           4
## # ℹ 3,484 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Ayrıca table ile tablolar oluşturabileceğimizi öğrendik.

table(midiPISA$CINSIYET)
## 
##    1    2 
## 3396 3494
table(midiPISA$ST097Q02TA)
## 
##    1    2    3    4 
##  511 1082 3664 1550

Filter, pipe operatörü, “ve” ile “veya” kullanarak verileri düzenleyebilmenin kolaylığını fark ettim.

midiPISA %>% 
  filter(Anne_Egitim==6)
## # A tibble: 887 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79201275     9        2           6           6     -1.15           2
##  2  79202343    11        2           6           6     -0.112          1
##  3  79203553    10        1           6           5      1.19           4
##  4  79204714    10        2           6           4      0.338          3
##  5  79200971    10        2           6           5     -0.167          3
##  6  79201796    10        2           6           6      0.842          4
##  7  79202928    10        2           6           6     -0.112          4
##  8  79204088    10        2           6           3     -0.841          2
##  9  79200826    10        1           6           6      2.61           3
## 10  79201124    10        2           6           6     -2.71           1
## # ℹ 877 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
midiPISA %>% 
  filter(Anne_Egitim==6 & Baba_Egitim==6)
## # A tibble: 636 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79201275     9        2           6           6    -1.15            2
##  2  79202343    11        2           6           6    -0.112           1
##  3  79201796    10        2           6           6     0.842           4
##  4  79202928    10        2           6           6    -0.112           4
##  5  79200826    10        1           6           6     2.61            3
##  6  79201124    10        2           6           6    -2.71            1
##  7  79201604    10        2           6           6    -1.15            3
##  8  79201805    10        2           6           6     1.08            3
##  9  79202821    10        2           6           6     0.538           2
## 10  79203623    10        2           6           6     0.0127          3
## # ℹ 626 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
midiPISA %>% 
  filter(!(Anne_Egitim==6) | Baba_Egitim==6)
## # A tibble: 6,586 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79200768    10        2           2           2    -0.289           1
##  2  79201064    10        2           2           2     0.604           3
##  3  79201118    10        1           1           2     0.638           2
##  4  79201275     9        2           6           6    -1.15            2
##  5  79201481     9        2           4           4     0.667           3
##  6  79201556    10        2           4           6     0.357           3
##  7  79201652    10        1           5           5    -0.0886          3
##  8  79202033    10        2           5           5     0.931           3
##  9  79202179    10        1           1           4     1.22            3
## 10  79202278    10        2           0           2     0.425           3
## # ℹ 6,576 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
midiPISA %>% 
  filter((Anne_Egitim==0 & Baba_Egitim==0))
## # A tibble: 128 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79203057    10        2           0           0      1.08           3
##  2  79201246    10        1           0           0      0.638          4
##  3  79206034    11        2           0           0      0.205          2
##  4  79206038    10        2           0           0      0.971          3
##  5  79203957    10        1           0           0     -0.325          3
##  6  79205430    10        1           0           0      1.01           4
##  7  79200013    10        2           0           0     -0.741          2
##  8  79201946    10        1           0           0     -0.618          1
##  9  79200998    10        1           0           0      1.23           4
## 10  79201589    10        1           0           0      0.863          4
## # ℹ 118 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Select Kullanımı

Veri setinden sütun bazında seçim yapmak için select() fonksiyonunu kullanılabilecğimizi öğrendik. Aşağıda örnekler verilmiştir.

“ST097” ile başlayanların seçilmesi

midiPISA %>%  select(starts_with("ST097"))
## # A tibble: 6,890 × 5
##    ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##         <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
##  1          1          2          1          1          1
##  2          3          2          3          3          3
##  3          2          3          3          3          3
##  4          2          2          3          1          1
##  5          3          3          4          3          1
##  6          3          3          2          2          3
##  7          3         NA          3          3          4
##  8          3          3          2          1          2
##  9          3          4          3          4          3
## 10          3          4          2          1          1
## # ℹ 6,880 more rows

“TA” ile bitenlerin seçilmesi

midiPISA %>% select(ends_with("TA"))
## # A tibble: 6,890 × 5
##    ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##         <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
##  1          1          2          1          1          1
##  2          3          2          3          3          3
##  3          2          3          3          3          3
##  4          2          2          3          1          1
##  5          3          3          4          3          1
##  6          3          3          2          2          3
##  7          3         NA          3          3          4
##  8          3          3          2          1          2
##  9          3          4          3          4          3
## 10          3          4          2          1          1
## # ℹ 6,880 more rows

“OD” içerenlerin seçilmesi

select(midiPISA,contains("OD"))
## # A tibble: 6,890 × 5
##    ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
##  1     376.     418.     421.     414.     434.
##  2     512.     473.     564.     485.     500.
##  3     396.     414.     423.     452.     392.
##  4     393.     429.     365.     383.     379.
##  5     552.     570.     563.     531.     532.
##  6     441.     416.     407.     437.     473.
##  7     411.     422.     426.     385.     461.
##  8     551.     552.     509.     491.     538.
##  9     542.     534.     501.     523.     497.
## 10     434.     470.     538.     495.     502.
## # ℹ 6,880 more rows

Aşağıdaki kodu kullanarak ekleme (başına - koyarak da çıkarma) yapabileceğimizi öğrendik.

midiPISA %>% 
  select(OGRENCIID:ST097Q04TA,-CINSIYET) %>% # sütun bazında değişken ekleme ve çıkarma. - çıkarma için kullanılmıştır.
head(5) #ilk beş satırın görüntülenmesi
## # A tibble: 5 × 9
##   OGRENCIID SINIF Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA ST097Q02TA
##       <dbl> <dbl>       <dbl>       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768    10           2           2     -0.289          1          2
## 2  79201064    10           2           2      0.604          3          2
## 3  79201118    10           1           2      0.638          2          3
## 4  79201275     9           6           6     -1.15           2          2
## 5  79201481     9           4           4      0.667          3          3
## # ℹ 2 more variables: ST097Q03TA <dbl>, ST097Q04TA <dbl>

Arrange Kullanımı

arrange() fonksiyonunun satırları sıralamak amacıyla kullanıldığını öğrendik. Sıralama işlemini alfabetik sıralamaya göre yaptığını, fakat ek bir fonksiyon yazıldığında büyüklük sırasına göre de sıralama yaptığını gördük. Böylece veri seti istenilen kritere göre sıralayarak değişkenler arasındaki ilişkinin daha pratik bir şekilde görülebileceğini öğrendik.
Bu fonksiyonunun kullanımı oldukça kolaydır; fonksiyonun içine veri setinin adını ve sıralama için kullanılacak değişkeni yazmak yeterli olur. Örneğin;

midiPISA %>% arrange(ODOKUMA1) #küçükten büyüğe
## # A tibble: 6,890 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79202924     9        2           6           6    NA               3
##  2  79203329     9        2           2           2     0.0127          1
##  3  79203445    10        2           6           1    -0.0738          1
##  4  79202889     9        2           1           2    -0.412           3
##  5  79201966    10        2           6           6    -0.116           3
##  6  79203650     9        2           0           5    NA               1
##  7  79206885     9        2           6           6     0.168           1
##  8  79204940    10        2           5           1     0.264           3
##  9  79201770     9        2           1           1    -0.122           3
## 10  79201089     9        2           0           0     0.137           3
## # ℹ 6,880 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
midiPISA %>% arrange(-ODOKUMA1) #büyükten küçüğe
## # A tibble: 6,890 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79202969    10        1           6           6      2.08           3
##  2  79200826    10        1           6           6      2.61           3
##  3  79200072    10        2           4           4      1.60           4
##  4  79200887     9        1           6           6      2.08           3
##  5  79207038     9        2           6           6      2.61           3
##  6  79202197    10        1           6           6      0.638          3
##  7  79201373    10        1           6           6      1.33           4
##  8  79203639    10        1           3           6      0.674          2
##  9  79201125    10        2           5           5      0.370          4
## 10  79200920    10        2           5           6      0.201          4
## # ℹ 6,880 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Pipe ile birlikte kullanımı örneği;

midiPISA %>%  arrange(OKUMA_ZEVK) %>% 
  head(5)
## # A tibble: 5 × 16
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
## 1  79204460    10        2           5           6      -2.73          1
## 2  79201124    10        2           6           6      -2.71          1
## 3  79204401    10        1           6           6      -2.71          3
## 4  79206724    10        2           6           6      -2.71          1
## 5  79204126    10        2           5           5      -2.71          4
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

select ve arrange birlikte kullanımı örneği;

midiPISA %>% 
 select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK) %>% #değişkenlerin seçimi
  arrange(OKUMA_ZEVK)%>% # değişkendeki gözlemleri sıralama
  head(6) #ilk 6 satırın görüntülenmesi
## # A tibble: 6 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79204460          1          1      -2.73
## 2  79201124          1          1      -2.71
## 3  79204401          3          2      -2.71
## 4  79206724          1          3      -2.71
## 5  79204126          4          4      -2.71
## 6  79205685          3          3      -2.71

Yeniden Adlandırma

bunun için rename() kullanılabileceğini gördük. Veri setinden istenilen değişkenler seçilerek yeni bir veri seti oluşturulmak istendiğinde seçilen değişkenlerin de ismini değiştirmek isteyebiliriz. Bu durumda rename() fonksiyonu (yeni ad=eski ad) şeklinde kullanılabilir. Örneğin;

midiPISA %>%   
select(ODOKUMA1,ODOKUMA2)%>% 
  rename(okumapuan1=ODOKUMA1,okumapuan2=ODOKUMA2) %>%
head(3) 
## # A tibble: 3 × 2
##   okumapuan1 okumapuan2
##        <dbl>      <dbl>
## 1       376.       418.
## 2       512.       473.
## 3       396.       414.

ortaokul-ilkokul olarak isimlendirme

Okultur <- midiPISA %>%
  select(1:5) %>%  #ilk beş değişkenin seçimi
  mutate(okul = ifelse(SINIF == 7 | SINIF == 8,
                       "Ortaokul", "Lise")) %>%  # okul değişkeninin veri setine eklenmesi 
 arrange(SINIF) # veri setinin SINIF değişkenine göre sıralanması

tail(Okultur)
## # A tibble: 6 × 6
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim okul 
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl> <chr>
## 1  79203092    12        1           0           1 Lise 
## 2  79204140    12        2           0           1 Lise 
## 3  79200174    12        1           5           5 Lise 
## 4  79206519    12        1           0           0 Lise 
## 5  79205173    12        1           5           5 Lise 
## 6  79201478    12        1           0           1 Lise
head(Okultur)
## # A tibble: 6 × 6
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim okul    
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl> <chr>   
## 1  79204097     7        1           2           2 Ortaokul
## 2  79207110     7        2           6           1 Ortaokul
## 3  79202600     7        2          NA          NA Ortaokul
## 4  79203158     8        1           5           5 Ortaokul
## 5  79206944     8        2           1           1 Ortaokul
## 6  79202569     8        2           1           0 Ortaokul

Mutate Kullanımı

mutate() fonksiyonu ile veri setine yeni değişkenler eklenirken mevcut değişkenlerin de korunacağını ancak transmutate() fonksiyonu ile eski değişkenlerin veri setiden çıkarılarak yeni değişkenler ekleneceğini öğrendik.
Recode into different variables ve Recode into same variables gibi…

zevk<- select(midiPISA, starts_with("ST097"))
zevk%>% 
mutate(toplam =ST097Q01TA+ST097Q02TA+ST097Q03TA+ST097Q04TA+ST097Q05TA)
## # A tibble: 6,890 × 6
##    ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA toplam
##         <dbl>      <dbl>      <dbl>      <dbl>      <dbl>  <dbl>
##  1          1          2          1          1          1      6
##  2          3          2          3          3          3     14
##  3          2          3          3          3          3     14
##  4          2          2          3          1          1      9
##  5          3          3          4          3          1     14
##  6          3          3          2          2          3     13
##  7          3         NA          3          3          4     NA
##  8          3          3          2          1          2     11
##  9          3          4          3          4          3     17
## 10          3          4          2          1          1     11
## # ℹ 6,880 more rows

Kısa bir yol

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA))) %>% 
head(3)
## # A tibble: 3 × 6
##   ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA toplam
##        <dbl>      <dbl>      <dbl>      <dbl>      <dbl>  <dbl>
## 1          1          2          1          1          1      6
## 2          3          2          3          3          3     14
## 3          2          3          3          3          3     14

Ekleyeceğimiz sütunu, istediğimiz değişkenin başına alma

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)),
       .before= ST097Q01TA)%>%
  head(3) 
## # A tibble: 3 × 6
##   toplam ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##    <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
## 1      6          1          2          1          1          1
## 2     14          3          2          3          3          3
## 3     14          2          3          3          3          3

Sonrasına alma

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)),
       .after= ST097Q01TA)%>%
  head(3) 
## # A tibble: 3 × 6
##   ST097Q01TA toplam ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##        <dbl>  <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
## 1          1      6          2          1          1          1
## 2          3     14          2          3          3          3
## 3          2     14          3          3          3          3

NOT:transmute() fonksiyonu kullanılarak yeni değişken oluşturulduğunda, işlemde kullanılan değişkenler veri setinden çıkarılır, sadece yeni oluşturulan değişken veri setine eklenir.

zevk %>% 
transmute(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)))
## # A tibble: 6,890 × 1
##    toplam
##     <dbl>
##  1      6
##  2     14
##  3     14
##  4      9
##  5     14
##  6     13
##  7     NA
##  8     11
##  9     17
## 10     11
## # ℹ 6,880 more rows

Ifelse Kullanımı

Bu derste öğrendiğimiz en önemli fonksiyonlardan biri IFELSE olmuştur. En sık kullanılan fonksiyonlardan biridir ve işleri oldukça kolaylaştırır. Örneğin;

x <- c(-2,1,-1,-3,3)
ifelse(x<0,"Negatif", "Pozitif")
## [1] "Negatif" "Pozitif" "Negatif" "Negatif" "Pozitif"

Case_when Kullanımı

v1 <- midiPISA %>%
  mutate(ODOKUMA1_kategorik =
    case_when(
      ODOKUMA1 <=  402.6  ~ "dusuk",
      ODOKUMA1 > 402.6  & ODOKUMA1 <  525.7 ~ "orta",
      ODOKUMA1 >=525.7 ~ "yuksek" )) %>%
      select(ODOKUMA1,ODOKUMA1_kategorik)
  head(v1)
## # A tibble: 6 × 2
##   ODOKUMA1 ODOKUMA1_kategorik
##      <dbl> <chr>             
## 1     376. dusuk             
## 2     512. orta              
## 3     396. dusuk             
## 4     393. dusuk             
## 5     552. yuksek            
## 6     441. orta

ÖDEV OLARAK VERİLEN ANCAK DERSTE YAPTIĞIMIZ IFELSE fonksiyonu örneği;

v1 <- midiPISA %>%
  mutate(ODOKUMA1_kategorik =
    if_else(ODOKUMA1 <= 402.6, "dusuk",
      if_else(ODOKUMA1 < 525.7, "orta", "yuksek")
    )
  ) %>%
  select(ODOKUMA1, ODOKUMA1_kategorik)
head(v1)
## # A tibble: 6 × 2
##   ODOKUMA1 ODOKUMA1_kategorik
##      <dbl> <chr>             
## 1     376. dusuk             
## 2     512. orta              
## 3     396. dusuk             
## 4     393. dusuk             
## 5     552. yuksek            
## 6     441. orta

İki kategorilide oldukça kolay olan bu komutu yazmak zor oldu. 3 kategorili olan ODOKUMA_1 değişkeni için ilk ifelse’ten sonra kalanlar için fonksiyonu yeniden yazmak gerekti. 4 kategorili olsaydı ifelse 3 defa yazılması gerekliydi.

Count Kullanımı

count() fonksiyonu frekans tablosu oluşturmak için kullanılmaktadır. Yine pipe operatörü ile birlikte sıklıkla kullanılmaktadır.

v1 %>% count(ODOKUMA1_kategorik)
## # A tibble: 3 × 2
##   ODOKUMA1_kategorik     n
##   <chr>              <int>
## 1 dusuk               1724
## 2 orta                3443
## 3 yuksek              1723

Group_by Kullanımı

SPSS’teki select case’e benzer. group_by() dan sonra kullanılan fonksiyonlar her grup için ayrı ayrı hesaplanama yapar ve bu fonksiyon içinde sürekli değişken kullanılmaz.

 group_by(ODOKUMA1_kategorik)

Summarize Kulanımı

summarise() fonksiyonu tek satırda veri setini özetleyerek yeni bir veri seti oluşturan fonksiyondur. Yani seçilen sütunlar için her satırı kullanarak özet istatistikleri hesaplar. Örneğin; min() minumum değer, max() maksimum değer, mean() ortalama değer, median() ortanca, quantile() q. yuzdelik, sd() standart sapma, var() varyans, diff(range())değiskenlik, first() ilk eleman, last() son eleman, nth() n. eleman n() toplam eleman sayısı, n_distinct() farklı değerlerin sayısı hesaplanabilir.

summarise(ODOKUMA1)

Birlikte Kullanım ve Tablo Oluşturma

count, group_by, select ve summarise sıklıkla birlikte kullanılır. Pipe operatörü de eklenirse daha şık ve kolay bir kod görünümü olur. Örneğin;
tablo şeklinde sunma

library(knitr)
v1 %>% 
  group_by(ODOKUMA1_kategorik) %>% 
  summarise(ort = mean(ODOKUMA1),
            sd = sd(ODOKUMA1)) %>% 
  kable(digits = 2,
        col.names = c("kategori", "ort", "sd"))
kategori ort sd
dusuk 352.59 38.86
orta 463.50 34.49
yuksek 577.39 40.58

Başka bir örnek

v1 %>% group_by(ODOKUMA1_kategorik) %>%  summarise(n=n())
## # A tibble: 3 × 2
##   ODOKUMA1_kategorik     n
##   <chr>              <int>
## 1 dusuk               1724
## 2 orta                3443
## 3 yuksek              1723
midiPISA %>% count(SINIF)
## # A tibble: 6 × 2
##   SINIF     n
##   <dbl> <int>
## 1     7     3
## 2     8    19
## 3     9  1295
## 4    10  5360
## 5    11   207
## 6    12     6

NOT: Bu işlem, virgül sonrası sort=true ile de yapılabilir.

Bu derste kitapta 2.4 across başlığına kadar ilerledik. Her geçen ders R diline daha fazla meraklanıyorum. Her bir özelliğini, neler yapılabileceğini tamamen öğrenmeyi çok istiyorum.