Bölüm 1 Veri Düzenleme I

1.1 dplyr paketi

Veri düzenlemede en sık kullanılan paketlerden biri olan dplyr paketi, içerdiği fonksiyonlar sayesinde veri düzenleme, sıralama, filtreleme, değişkenleri gruplama, yeni değişkenler oluşturma, seçme ve dönüştürme gibi işlemleri kolaylıkla yapabilmektedir. tidyverse evreninin bir parçası ve sözlük anlamı veri işleme grameri olan bu paket, veri düzenleme ve analizi sürecini oldukça kolaylaştırmaktadır. Veri manipülasyonunun grameri olarak bilinen paketin içerdiği fonksiyonlar, düzgün veri manipülasyonuna olanak tanımaktadır.

Paketin en sık kullanılan fonksiyonları; işlemleri bağlayan bağlama (pipe) %>%, istenilen değişkenlere göre yeni bir veri seti oluşturan select(), gözlemlerin seçilen degişkenlere göre yeniden sıralamaya yarayan arrange(), istenilen gözlemlerle yeni bir veri oluşturan filter(), yeni değişkenleri veri setine ekleyen mutate(), veride grup bazında işlem yapabilen group_by(), veriden özet istatistikleri elde eden summarise() ve verileri birleştirme işlemi yapabilen join() fonsiyonlarıdır. Veri düzenleme I bölümünde select(), filter(), arrange() ve mutate(), veri düzenleme II bölümünde veriyi üst düzeyde toplama işlemlerini gerçekleştiren count(), group_by() ve summarise() fonksiyonları, veri düzenleme III bölümünde birleştirme işlemleri yapan join() fonksiyonları açıklanmıştır. Veri düzenleme IV bölümünde ise veriyi R ortamına aktardıktan sonra verinin analize uygun formata getirilmesine ve tidyr paketi ile birlikte en sık kullanılan fonksiyonlara değinilmiştir.

Veri düzenlemede genellikle birden fazla değişkene ilişkin gözlemlerin yer aldığı veri setleri kullanılır. Pratiklik ve kolay anlaşılabilirlik adına PISA veri setinden değişken sayısının azaltılmasıyla oluşturulan midiPISA veri seti okutulmuş ve gerekli düzenlemeler yapılmıştır.

library(tidyverse) # paketin aktifleştirilmesi
load("data/midiPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
midiPISA<- expss::drop_var_labs(midiPISA) # değişken etiketlerinin atılması

tidyverse paketi aktif hâle getirildikten sonra oluşturulan data dosyasından midiPISA verisi yüklenir. PISA verileri OECD web adresinden SPSS formatında çekildiği için değişken etiketleri(label) ile birlikte gelmektedir. Bu etiket isimleri bazen R paketlerindeki fonksiyonlar ile birlikte çalışmamaktadır. Bu nedenle expss::drop_var_labs bu etiketlerin kaldırılmasını sağlar ve midiPISA veri seti üzerine kaydedilir.

Bir diğer alternatif ise değişken etiketlerini faktör düzeyi olarak kaydetmektir. 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)

1.2 pipe (%>%)

%>% simgesiyle ifade edilen pipe (bağlantı) operatörü, aynı veri tabanında yer alan bazı fonksiyonların birlikte tek bir kod hâlinde kullanılmasını sağlamaktadır. Bu durum fazla yazma yükünü ortadan kaldırarak kodu okunabilir kılmaktadır. Böylece veri daha pratik ve anlaşılır hâle gelerek kullanışlılığı artmaktadır. Aslında dplyr paketindeki tüm fonksiyonlar, daha az değişken oluşturmak amacıyla pipe operatörü (%>%) ile kullanılabilir.

%>% operatörü veri düzenleme işlemlerinde her zaman kullanışlı olduğundan sık tercih edilen bir operatördür. Kısa yolu windows için Ctrl+Shift+M, mac için Cmd+Shift+M’dir. Bu operatör magrittr paketinde yer aldığı için pipe operatörü kullanılırken paketin aktifliği kontrol edilmelidir.

%>% 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.

library(dplyr) # paketin aktifleştirilmesi
library(magrittr) # paketin aktifleştirilmesi
x %>% f(y) = f(x, y)

pipe operatörü ile zincirleme bağlama da yapılabilir. Fakat pipe, her bir fonksiyonu ayrı bir satırda bulundurulduğunda en net şekilde okunur. Bu nedenle her bir fonsiyonun ayrı yazılmasına dikkat edilmesi gerekir.

veri %>% 
  ilk_fonksiyon(.....) %>% 
  ikinci_fonksiyon(.....) %>% 
  ucuncu_fonksiyon(.....) %>% ...

Gerçek bir veri seti üzerinden pipe operatörü ile ilgili bir örnek yapalım.

library(dplyr) # paketin aktifleştirilmesi
library(magrittr) # paketin aktifleştirilmesi (pipe operatörü için)
midiPISA %>%
 filter(SINIF==9) %>% #sadece 9. sınıf öğrencilerinin seçilmesi
  head(5) # ilk beş satırın görüntülenmesi
## # A tibble: 5 × 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  79201481     9        2           4           4      0.667          3
## 3  79202354     9        2           4           4     -1.13           1
## 4  79202395     9        2           2           4      1.01           4
## 5  79203125     9        1           5           5      1.38           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Elde edilen çıktı incelendiğinde, midiPISA veri setinde 9. sınıf öğrencilerine ait gözlemlerin ilk beş satırı görüntülenmektedir. Bu örnekteki filter() fonksiyonu sadece sınıf düzeyi “9” olan öğrencilerin seçilmesini sağlamıştır. Bir sonraki başlıkta bu fonksiyon detaylı bir şekilde anlatılmıştır.

R nesne (object) yönelimli bir programlama dilidir. pipe operatörünün kullanımı ile oluşan çıktıdan yeni bir nesne oluşturmak istenirse, atama operatöru <- kullanılmalıdır. Bu şekilde oluşturulan yeni veri seti de çalışma alanına kaydedilmiş olur.

veri<- midiPISA %>%
  filter(SINIF==9) %>% #sadece 9. sınıf öğrencilerinin seçilmesi
  head(5) # ilk beş satırın görüntülemesi
veri # oluşturulan nesnenin okutulması
## # A tibble: 5 × 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  79201481     9        2           4           4      0.667          3
## 3  79202354     9        2           4           4     -1.13           1
## 4  79202395     9        2           2           4      1.01           4
## 5  79203125     9        1           5           5      1.38           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Oluşturulan veri seti atama operatörü ile (<-) “veri” nesnesine atanmış ve “veri” adlı yeni bir veri seti oluşturulmuştur. Burada pipe operatörü ile birden fazla işlem birbirine bağlanmıştır. Fakat bağlama işlemleri ne kadar uzun olursa olsun <- operatörünün en başta yer alması gerektiği bilgisi unutulmamalıdır.

1.3 filter()

Satır bazında veri seçim işlemi yapmak amacıyla filter() fonksiyonu kullanılır. Böylece veri setindeki istenilen değişkenler filtrelenerek sadece bu gözlemlerden oluşan yeni bir veri seti elde edilir.

  • filter() fonksiyonu kullanımı;
filter(veri_seti, kosul ve/veya kosullar)

Buradaki filtreleme işlemi tek bir fonsiyon içinde ifade edildiği gibi pipe operatörü ile de kullanılabilir.

  • filter() fonksiyonunun pipe ile kullanımı;
veri_seti %>% filter(kosul ve/veya kosullar)

filter() fonksiyonu ek olarak mantıksal operatörleri kullanarak koşulları test ettiğinden bu operatörlerin bilinmesi oldukça önemlidir. En sık kullanılan mantıksal operatörler eşittir “==”, eşit değil “!=”, büyüktür “>”, küçüktür “=<”, büyük eşittir “>=” olup bunların kombinasyonları da kullanılabilir. Çünkü filter() fonksiyonu birden fazla mantıksal testi aynı anda çalıştırarak istenilen satır ya da gözlemin seçilmesini sağlar.

filter() fonksyonuna geçmeden önce mantıksal operatörler ile koşulların test edildiği örneklere yer verelim:

Örneğin x nesnesi 8-2*3+1 işlemi olarak tanımlansın ve x’in 3’e eşit olup olmadığı test edelim.

x <- 8-2*3+1
x==3
## [1] TRUE

Çıktıda yer alan “TRUE”, sonucun “3” olduğunu yani sonucun doğruluğunu göstermektedir.

y nesnesi olarak tanımlanan işlemin 3’e eşit olmadığı varsayılsın. Bu işlemin sonucu ise şüphesiz “FALSE” olacaktır. Çünkü yukarıdaki örnekte işlem sonucunun “3” olduğu bulunmuştu.

y <- 8-2*3+1
y!=3
## [1] FALSE

Çıktıda TRUE, FALSE ve NA değerleri yer alabilir. filter() fonksiyonu koşulun sağlandığı satırları seçer. & (ve), | (veya) , !(değil) operatörleri de filter() fonksiyonu ile oldukça sık kullanılır.

filter() fonksiyonu ile midiPISA veri setini kullanarak sadece kız öğrencilerden oluşan yeni bir veri seti oluşturmaya çalışalım. Öncelikle cinsiyet ile ilgili bilgiyi içeren CINSIYET adlı değişken belirlenir. Bu değişkende kız öğrenciler “1” ve erkek öğrenciler “2” olarak kodlanmıştır.

kiz <- filter(midiPISA, CINSIYET ==1) %>% # CINSIYETe göre filtreleme
  head(5) #ilk beş satırın görüntülenmesi
kiz
## # A tibble: 5 × 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
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Görüldüğü gibi bu fonksiyon midiPISA veri seti ile beraber bir mantıksal test ifadesi içerir. Bu mantıksal test ifadesi “CINSIYET == 1”, yani kız öğrenciler şeklinde ifade edilmiştir. Böylece bu mantıksal kontrole dayanarak oluşan “kiz” isimli veri setinde “CINSIYET” değişkeninin sadece “1” olarak kodlandığı gözlemler seçilir.

midiPISA verisinde Anne_Egitim anne eğitim düzeyini, Baba_Egitim baba eğitim düzeyini belirten değişkenlerdir. Belirtilen değişkenlerde lisansüstü mezun olma durumu “6” kodu ile belirtilmektedir. Anne eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;

midiPISA %>% 
  filter(Anne_Egitim==6) %>% 
  head(5) 
## # A tibble: 5 × 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
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Çıktıda anne eğitim düzeyi sadece lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

  • Anne eğitim düzeyi ve baba eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;
midiPISA %>% 
  filter(Anne_Egitim==6 & Baba_Egitim==6) %>%  
  head(5) 
## # A tibble: 5 × 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
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Çıktıda hem anne eğitim düzeyi hem de baba eğitim düzeyi lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

  • Anne eğitim düzeyi veya baba eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;
midiPISA %>% 
  filter(Anne_Egitim==6 | Baba_Egitim==6) %>% 
  head(5) 
## # A tibble: 5 × 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  79201556    10        2           4           6      0.357          3
## 3  79202343    11        2           6           6     -0.112          1
## 4  79203553    10        1           6           5      1.19           4
## 5  79203843    10        2           5           6      0.780          4
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Çıktıda anne eğitim düzeyi veya baba eğitim düzeyi lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

Özellikle büyük veriler ile çalışıldığında filter() fonksiyonu, sadece istediğimiz gözlemlerden oluşan yeni bir veri seti oluşturması açısından önemli bir pratiklik sağlar. Tabi ki yeni oluşan veri setini bir nesneye atayarak çalışma alanına kaydetmeyi unutmamak gerekir.

1.4 select()

Veri setinden sütun bazında seçim yapmak için select() fonksiyonu kullanılabilir. Bu fonksiyonun kullanımı;

select(veri_seti, degisken_adi, degisken_adi,..)

select() fonksiyonu dplyr içindeki diğer fonksiyonlarla da sıklıkla kullanılır. Örneğin pipe operatörü ile kullanımı;

veri_seti %>% select(degisken_adi, degisken_adi,..)

midiPISA veri seti ile select() fonksiyonunu kullanarak yeni bir veri seti oluşturalım.

library(tidyverse) 
midiPISA %>%
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)%>% 
head(5) 
## # A tibble: 5 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768          1          1     -0.289
## 2  79201064          3          3      0.604
## 3  79201118          2          3      0.638
## 4  79201275          2          1     -1.15 
## 5  79201481          3          3      0.667

Görüldüğü üzere dört değişkenden oluşan yeni bir veri seti oluşturulmuştur.select() fonksiyonu, orijinal veri setinde herhangi bir değişikliğe yol açmaz. Bu nedenle seçim yapılan değişkenlerden oluşan yeni veri setini ayrı bir R nesnesine atayarak kaydetmek gereklidir.

Bazen özellikle büyük veri setleri ile çalışıldığında, değişkenlerin tek tek isimlerini yazarak seçmek oldukça vakit alabilir. O nedenle select() fonksiyonu ile belirli bir aralıkta yer alan değişkenler iki nokta : operatörü ile seçilebilirken, bu aralıkta dâhil edilmek istenmeyen değişkenler kısa çizgi - operatörü ile ifade edilebilir.

midiPISA %>% 
  select(OGRENCIID:ST097Q04TA,-CINSIYET) %>% # sütun bazında değişken ekleme ve çıkarma
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>

Elde edilen çıktı incelendiğinde, OGRENCIID, SINIF, Anne_Egitim, Baba_Egitim,OKUMA_ZEVK,ST097Q01TA, ST097Q02TA, ST097Q03TA ve ST097Q04TA değişkenleri seçilmiştir. Bu aralıkta yer alan CINSIYET değişkeni ise seçilmemiştir.

Sadece dplyr paketi içindeki select() fonksiyonu içinde çalışan ve daha detaylı seçimler yapma imkânı sunan bir grup yardımcı fonksiyon içermektedir. Bunlardan en sık kullanılanlar; starts_with(), contains(), matches(), num_range() fonksiyonlarıdır. Burada dikkat edilmesi gereken nokta bu fonksiyonların içindeki ifadenin çift tırnak ( ) ile beraber kullanılması gerekliliğidir.

  • starts_with() sadece select() fonksiyonu içinde çalışan ve değişken seçme işlemini kolaylaştıran yardımcı bir fonksiyondur. Örneğin ST097 ile başlayan degişkenler starts_with() fonksiyonu ile seçilebilir.
select(midiPISA, starts_with("ST097")) %>%  
  head(5) 
## # A tibble: 5 × 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

Elde edilen çıktı incelendiğinde “ST097” ile başlayan beş değişkenin seçildiği yeni veri setine ait ilk beş satır görülmektedir.

  • ends_with() benzer şekilde TA ile biten değişkenler seçilmek istendiğinde kullanılır.
# "TA" ile biten degişkenlerin seçimi
select(midiPISA, ends_with("TA")) %>%   
  head(5) 
## # A tibble: 5 × 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

Elde edilen çıktı incelendiğinde “TA” ile biten beş değişkenin seçildiği görülmektedir.

  • contains() yine benzer şekilde içinde belli harfler geçen değişkenler seçilmek istendiğinde kullanılır. Örneğin içinde OD geçen değişkenlerin seçilmesi;
select(midiPISA,contains("OD")) %>%  
  head(5)
## # A tibble: 5 × 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.

Elde edilen çıktıya göre içinde “OD” geçen beş okuma olası değerin yer aldığı değişkenler görülmektedir.

  • matches() içinde 02 geçen değişkenlerin seçilmesinde kullanılır.
select(midiPISA, matches("02")) %>% 
  head(5)
## # A tibble: 5 × 1
##   ST097Q02TA
##        <dbl>
## 1          2
## 2          2
## 3          3
## 4          2
## 5          3

Elde edilen çıktıya göre içinde “02” geçen bir değişken görülmektedir.

  • num_range() fonksiyonu ise ardışık ilerleyen değişkenlerin seçilmesinde kullanılır. midiPISA veri setinde okuma ile ilgili beş olası değer bulunduğundan sadece 1 ve 3 arasındakiler seçilmiştir ve ilk beş gözleme ait değerler istenmiştir. Tabi ki bu örneğimizde değişken sayısı az olduğundan bu seçim çok anlamlı görünmeyebilir fakat özellikle büyük verilerle çalışılırken bu seçim işlemi oldukça pratik olabilmektedir.
select(midiPISA,num_range("ODOKUMA",1:3)) %>% 
  head(5) 
## # A tibble: 5 × 3
##   ODOKUMA1 ODOKUMA2 ODOKUMA3
##      <dbl>    <dbl>    <dbl>
## 1     376.     418.     421.
## 2     512.     473.     564.
## 3     396.     414.     423.
## 4     393.     429.     365.
## 5     552.     570.     563.

Okuma puanı olası değerleri veri setinde sıralı bir şekilde yer aldığından, bu değerlerden ilk üçü num_range() fonksiyonu kullanılarak seçilmiştir.

Farklı fonksiyonlar ve aynı anda mantıksal operatörler kullanılarak da seçim işlemleri gerçekleştirilebilir. Örneğin veya | operatörü kullanılarak seçim yapılabilir.

midiPISA veri setinde “OD” içeren veya içinde “1” rakamı geçen değişken seçimi;

select(midiPISA,contains("OD") | matches("1")) %>% head(5) 
## # A tibble: 5 × 6
##   ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5 ST097Q01TA
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>      <dbl>
## 1     376.     418.     421.     414.     434.          1
## 2     512.     473.     564.     485.     500.          3
## 3     396.     414.     423.     452.     392.          2
## 4     393.     429.     365.     383.     379.          2
## 5     552.     570.     563.     531.     532.          3

Elde edilen çıktı incelendiğinde, içinde “OD” veya “1” geçen toplam altı değişken olduğu görülmektedir. & operatörünün kullanımı da oldukça fazladır.

midiPISA veri setinde A harfini içeren ve içinde “2” rakamı olan değişkenlerin seçimi için;

select(midiPISA,contains("A") & matches("2")) %>% head(5) 
## # A tibble: 5 × 2
##   ST097Q02TA ODOKUMA2
##        <dbl>    <dbl>
## 1          2     418.
## 2          2     473.
## 3          3     414.
## 4          2     429.
## 5          3     570.

Çıktı incelendiğinde “O” harfini içeren ve içinde “2” rakamı olan ST097Q02TA ve ODOKUMA2 değişkenleri olmak üzere iki değişken olduğu görülmektedir.

Hariç tutmak ve veri setinden çıkarmak amacıyla - operatörü kullanılabilir. “O” harfini içermeyen ve içinde “0” rakamı olmayan değişkenlerin seçimi için;

select(midiPISA,-contains("O"),-matches("0"))  %>% head(5)
## # A tibble: 5 × 4
##   SINIF CINSIYET Anne_Egitim Baba_Egitim
##   <dbl>    <dbl>       <dbl>       <dbl>
## 1    10        2           2           2
## 2    10        2           2           2
## 3    10        1           1           2
## 4     9        2           6           6
## 5     9        2           4           4

Elde edilen çıktı incelendiğinde, midiPISA veri setinden “O” içermeyen ve içinde “0” rakamı olmayan SINIF, CINSIYET, Anne_Egitim ve Baba_Egitim değişkenleri seçilmiştir.

1.5 arrange()

arrange() fonksiyonu satırları/gözlemleri sıralamak amacıyla kullanılır. Sıralama işlemini alfabetik sıralamaya göre yapar. Fakat ek bir fonksiyon yazıldığında büyüklük sırasına göre de sıralama yapar. Böylece veri seti istenilen kritere göre sıralanarak değişkenler arasındaki ilişki daha pratik bir şekilde görülebilir. arrange() 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.

  • arrange() fonksiyonunun kullanımı;
arrange(veri_seti, degisken_adi) 
  • arrange() fonksiyonunun pipe operatörü %>% ile kullanımı;
veri_seti %>% arrange(degisken_adi)

Örnek veri seti üzerinden dört değişken seçip yeni bir veri setine (df) atayarak kaydedelim.

df <- midiPISA %>% 
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)
  df %>% head(6) 
## # A tibble: 6 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768          1          1     -0.289
## 2  79201064          3          3      0.604
## 3  79201118          2          3      0.638
## 4  79201275          2          1     -1.15 
## 5  79201481          3          3      0.667
## 6  79201556          3          2      0.357
  • Yeni oluşan df veri setini OKUMA_ZEVK(okumaktan zevk alma) puanlarına göre sıralayalım.
arrange(df,OKUMA_ZEVK) %>% 
  head(5)
## # A tibble: 5 × 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

Elde edilen çıktı incelendiğinde, arrange() fonksiyonu ile öğrencilerden elde edilen gözlemler okumaktan zevk alma puanlarına göre küçükten büyüğe sıralanmıştır. Çünkü paket içerisinde yer alan fonksiyon sıralamayı önceden tanımlı/default olarak küçükten büyüğe yapar. Fakat bu gözlemler, büyükten küçüğe sıralanmak istendiğinde ek olarak arrenge() fonksiyonu içine desc() fonksiyonu yazılır.

arrange(df,desc(OKUMA_ZEVK))%>%  #büyükten küçüğe sıralama
  head(5)
## # A tibble: 5 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79206987          3          2       2.66
## 2  79204432          3          3       2.66
## 3  79206337          4          4       2.66
## 4  79203300          3          2       2.61
## 5  79205358          4          2       2.61

1.5.1 select() ve arrange() fonksiyonları

Yeni bir veri seti tanımlanmadan da pipe operatörü kullanılarak tek bir kod hâlinde sıralama yapılabilir.

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

1.5.2 rename()

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.

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.

Görüldüğü üzere veri setinden seçilen ODOKUMA1 ve ODOKUMA2 sütunlarının isimleri okumapuan1 ve okumapuan2 olarak değiştirilmiştir.

select() fonksiyonu içinde değişken seçimi sırasında da değişken adı değişimi yapılabilir. Örnekte midiPISA veri setinden dört değişken seçilerek oluşturulan yeni veri setinde okuma becerileri olası değerleri 1 in yer aldığı ODOKUMA1 değişkeninin adı okumapuan1 olarak değiştirilip seçilebilir.

midiPISA %>%   
select(OGRENCIID,ST097Q02TA,ST097Q03TA, okumapuan1=ODOKUMA1) %>%  
head(3) 
## # A tibble: 3 × 4
##   OGRENCIID ST097Q02TA ST097Q03TA okumapuan1
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768          2          1       376.
## 2  79201064          2          3       512.
## 3  79201118          3          3       396.

Yeni seçilen veri setinde sadece ODOKUMA1 değişkeninin ismi okumapuan1 olarak değiştirilmiştir. Diğer üç değişkenin isminin aynı kaldığı görülmektedir.

1.6 mutate()

mutate() fonksiyonu ile veri setine yeni değişkenler eklenirken mevcut değişkenler de korunur ancak transmute() fonksiyonu ile eski değişkenler veri setiden çıkarılarak yeni değişken eklenir.

mutate() fonksiyonunun kullanımı;

mutate(veri_seti, yeni_değişken = değişken1 + değişken2)

Örneğin ST097 ile başlayan maddelerden yeni bir veri seti oluşturulup, bu veri setine toplam puan eklenebilir. Aşağıdaki örnekte ST097 ile başlayan maddeler seçilmiş ve seçilen beş maddenin toplamı ayrı bir değişken olarak eklenmiştir. Oluşturulan bu toplam puan değişkeni ve beş madde zevk adlı yeni bir veri seti olarak eklenmiştr.

zevk<- select(midiPISA, starts_with("ST097"))
zevk%>% 
mutate(toplam =ST097Q01TA+ST097Q02TA+ST097Q03TA+ST097Q04TA+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

Bu örnekte değişken değerleri + ile toplanacağı gibi rowSums() fonksiyonu ile de aşağıdaki gibi toplanabilir. Bu bize özellikle çok fazla maddenin yer aldığı ölçeklerde toplam puan almada pratiklik sağlar. Örnekte kullanılan across(), aynı dönüşümü birden fazla sütuna uygulamayı kolaylaştırarak summarise() ve mutate() gibi fonkisyonların içinde select() ile aynı işlevi kullanmanıza olanak tanır.

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

Ayrıca yeni değişken üretiminde sadece toplama değil istenen her türlü işlem yapılabilir. Yeni eklenecek yerler .before ya da .after argümanları ile düzenlenebilir.

midiPISA veri setinde yer alan ST097Q01TA, ST097Q02TA, ST097Q03TA, ST097Q04TA ve ST097Q05TA maddelerinden elde edilen toplam puan değişkeni “ST097Q01TA” değişkeninin hemen önüne eklenir.

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

Ek olarak mutate() fonksiyonu ile birden fazla değişken de eklenebilir. Yani tek bir kod ile birden fazla yeni değişken üretilebilir.

mutate(veri_seti, yeni_değişken1 = değişken1 + değişken2, yeni_değişken2 = değişken3 * değişken4)

1.6.1 transmute()

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))) %>% 
head(2) 
## # A tibble: 2 × 1
##   toplam
##    <dbl>
## 1      6
## 2     14

1.6.2 ifelse()

ifelse() programlama dillerinde sıklıkla kullanılan koşullu önermelerden biridir. ifelse() fonksiyonunun kullanımı;

ifelse(test = x<0, evet = ilkdeger , hayır = ikincideger)

Bir örnek üzerinde ifelse() fonksiyonunu açıklayalım. Öncelikle x nesnesini aşağıdaki gibi tamsayılardan oluşturalım ve ifelse() fonksiyonu sayesinde sıfırdan küçük olanlar negatif, büyük olanlar pozitif olacak şekilde tanımlansın.

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

Çıktıda görüldüğü üzere tamsayıların negatif veya pozitif olduğu sırasıyla belirlenmiştir.

midiPISA verisindeki sınıf düzeyi değişkeni kullanılarak bir örnek yapalım. Sınıf değişkeninde 7., 8., 9., 10., 11. ve 12.sınıf öğrencileri yer almaktadır ve aşağıda görüldüğü gibi ortaokul düzeyinde oldukça az sayıda öğrenci bulunmaktadır.

table(midiPISA$SINIF)
## 
##    7    8    9   10   11   12 
##    3   19 1295 5360  207    6

SINIF değişkenini kullanarak ortaokul ve lise olmak üzere iki düzeyli OKUL adlı bir değişken oluşturalım. Oluşturulacak yeni değişken “ortaokul” ve “lise” olmak üzere iki kategorili olup 7. ve 8. sınıflar ortaokul diğer sınıflar ise lise olarak kodlanmıştır.

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

Elde edilen çıktıda son üç satırdaki sınıf düzeyleri 12 olduğundan okul değişkeninin son üç satırı da lise olarak kategorilendirilmiştir.

head(Okultur,3)
## # A tibble: 3 × 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

Elde edilen çıktıda ilk üç satırdaki sınıf düzeyleri 7 olduğundan okul değişkeninin ilk üç satırı da ortaokul olarak kategorilendirilmiştir.

1.6.3 case_when()

case_when() fonksiyonu çoklu ifelse() kullanımı ile benzer işlevi sağlar. case_when() birden fazla koşula dayalı karşılaştırmalarda yeni bir değişken oluşturmak amacıyla kullanılır.

  • ODOKUMA1 düzeyine ilişikin betimsel istatistikler;
summary(midiPISA$ODOKUMA1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   402.6   463.4   464.2   525.7   771.5

ODOKUMA1 değişkeninin kategorik hale getirilmesinde çeyreklik puanları kullanılmıştır.

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

Okuma puanı 402.6’dan küçük olanlar düşük, 402.6 ile 525.7 arasında olanlar orta, 525.7 den büyük olanlar ise yüksek olarak kategorilendirilmiştir. Oluşturulan ODOKUMA1_kategorik adlı yeni değişken ile okuma puanı olası değerlerinin yer aldığı ODOKUMA1 değişkeninden oluşan yeni veri seti v1 olarak çalışma alanına kaydedilmiştir. head() fonksiyonu ile v1 veri setinin ilk altı satırı görüntülenmektedir.

  • Oluşturulan yeni ODOKUMA1 kategorik degişkeninindeki düzeylerin veri setinde nasıl dağıldığını inceleyelim.
v1 %>% group_by(ODOKUMA1_kategorik) %>% summarise(f=n())
## # A tibble: 3 × 2
##   ODOKUMA1_kategorik     f
##   <chr>              <int>
## 1 dusuk               1724
## 2 orta                3443
## 3 yuksek              1723

Elde edilen çıktıda her bir kategoriye ait frekans değerleri yer almaktadır.

Bu bölümde dplyr paketi ve bu pakette yer alan beş temel veri düzenleme fonksiyonu açıklanmıştır.