R Dersleri - Ali Onur Gitmez

Ana Sayfa Ders 1 Ders 2 Ders 3 Ders 4 Ders 5 Ders 6 Ders 7 Ders 8 Ders 9 Ders 10 Ders 11 Ders 12 Ders 13 Ders 14 Ders 15

Matrices

Matrisler vektorler ve listlerin aksine cok boyutlu veri tipleridir. Yani hem x hem de y ekseninde veri bulundururlar. Veri ve istatistik alanlarinda bunlara row ve column deriz. Su ana kadar gordugumuz veri yapilari hep tek boyutluydu. Boylece, R ile bolca kullanacagimiz veri sekline giris yapmis oluyoruz.

Matrisler, ileride gorecegimiz array veri tipinin bir formu olarak dusunulebilinir. Array formu 2den fazla boyut alabilirken matrisler 2 boyutludur. Genellikle numeric verileri gostermek icin kullanilir.

Matris olusturmak icin matrix() komutunu kullaniriz.

Burada ilk girdigimiz veri matris icinde olacak veriler. Ornek icin 1:12 arasindaki sayilari girmesini soyledim. nrow komutu ise kac row istedigimizi, ncol ise kac column istedigimizi belirtiyor. Bunu 3 4 veya 6 2 gibi farkli sekillerde de yapabilirdim. byrow ise sayilarin nasil doldurulmasini istedigimizi soyluyor. Bunu TRUE yaptigimiz zaman sayilari ilk once birinci rowa sonra ikinci rowa olmak uzere dizecek. Eger FALSE deseydik de ilk once ilk columni dolcuracak ve sonra ikinci columna gececekti

matrix1 <- matrix(1:12, nrow = 4, ncol = 3, byrow = TRUE)
matrix1
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
matrix2 <- matrix(1:12, nrow = 4, ncol = 3, byrow = FALSE)
matrix2
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

Row ve column isimlendirmesi yapmak istiyorsak rownames ve colnames komutlarini kullanabiliriz.

rownames(matrix2) <- c("Ilk satir", "Ikinci satir", 
                       "Ucuncu satir", "Dorduncu satir")
colnames(matrix2) <- c("Ilk sutun", "Ikinci sutun", 
                       "Ucuncu sutun")
matrix2
               Ilk sutun Ikinci sutun Ucuncu sutun
Ilk satir              1            5            9
Ikinci satir           2            6           10
Ucuncu satir           3            7           11
Dorduncu satir         4            8           12

Ancak bu sekilde ugrasmadan daha basit bir sekilde isimlendirme yapabiliriz. Burada tercih kullanan kisiye kalmis. Bazilari tek komut icinde yazmayi zor bulabilecegi icin ilk yontemi tercih edebiliriz ama daha kisa bir sekilde ayni sonuca erismek mumkun oldugu icin ikinci yontem de tercih edilebilir.

Bu komut opsiyonel olarak eklenen dimnames komutu. Boylece hem rowlara hem de columnlara ayni anda isim vermemiz mumkun.

matrix2 <- matrix(1:12, nrow = 4, ncol = 3, byrow = FALSE, 
                  dimnames = list(c("Satir 1", "Satir 2", 
                                     "Satir 3", "Satir 4"),
                                  c("Sutun 1", "Sutun 2", 
                                    "Sutun 3")))
matrix2
        Sutun 1 Sutun 2 Sutun 3
Satir 1       1       5       9
Satir 2       2       6      10
Satir 3       3       7      11
Satir 4       4       8      12

Isterdigimiz bir vektoru matrise donusturebiliriz.

sequence_vector <- 1:10
matrix_vector <- matrix(sequence_vector, 
                        nrow = 5, ncol = 2)
matrix_vector
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

Burada dikkatimizi cekebilecek bir nokta byrow argumanini girmemem. Cunku default olarak byrow argumanu false degerini alir. Boyle oldugu icin belirtmedigim zaman dogrudan columnlara gore dolduruyor.

Istersek iki vektoru birlestirip matris olusturabiliriz

yeni_vektor1 <- c(1,2,3,4)
yeni_vektor2 <- c(5,6,7,8)

rowmatrix <- rbind(yeni_vektor1, yeni_vektor2)
columnmatrix <- cbind(yeni_vektor1, yeni_vektor2)
rowmatrix
             [,1] [,2] [,3] [,4]
yeni_vektor1    1    2    3    4
yeni_vektor2    5    6    7    8
columnmatrix
     yeni_vektor1 yeni_vektor2
[1,]            1            5
[2,]            2            6
[3,]            3            7
[4,]            4            8

Matrisler hakkinda bilgilere kolay komutlarla ulasabiliriz. Bu komutlar bundan sonra gorecegimiz data frame veri tipinde de cok isimize yarayacak.

dim(matrix_vector)
[1] 5 2
nrow(matrix_vector)
[1] 5
ncol(matrix_vector)
[1] 2
length(matrix_vector)
[1] 10
str(matrix_vector)
 int [1:5, 1:2] 1 2 3 4 5 6 7 8 9 10

Matrislerin icindeki elementlere vektorlerde yaptigimiz gibi erisebiliriz. Ancak cok boyutlu veriler oldugu icin amiral batti oyunu oynar gibi column ve row sayisini belirtip elementi almamiz gerekir.

Tek elemente ulasmak icin

matrix2[2,3]
[1] 10

Butun rowa ulasmak icin

matrix2[2, ]
Sutun 1 Sutun 2 Sutun 3 
      2       6      10 

Butun columna ulasmak icin

matrix2[,3]
Satir 1 Satir 2 Satir 3 Satir 4 
      9      10      11      12 

Belli bir araliktaki elementlere ulasmak icin

matrix2[2:4,1:3]
        Sutun 1 Sutun 2 Sutun 3
Satir 2       2       6      10
Satir 3       3       7      11
Satir 4       4       8      12

Sadece belli kriteri karsilayan elementlere ulasmak icin

matrix2[matrix2>7]
[1]  8  9 10 11 12

Matrisler ile hesaplama ve degisiklik islemleri yapmamiz mumkundur.

Matrisin icindeki bir elementi degistirmek istiyorsak

matrix2[1,3] <- 47
matrix2
        Sutun 1 Sutun 2 Sutun 3
Satir 1       1       5      47
Satir 2       2       6      10
Satir 3       3       7      11
Satir 4       4       8      12

Butun bir rowu degistirmek istiyorsak

matrix2[2, ] <- c(26, 38, 73)
matrix2
        Sutun 1 Sutun 2 Sutun 3
Satir 1       1       5      47
Satir 2      26      38      73
Satir 3       3       7      11
Satir 4       4       8      12

Butun bir columnu degistirmek istiyorsak

matrix2[,1 ] <- c(54, 19, 63, 97)
matrix2
        Sutun 1 Sutun 2 Sutun 3
Satir 1      54       5      47
Satir 2      19      38      73
Satir 3      63       7      11
Satir 4      97       8      12

Matrislere sonradan row ve column eklemesi de yapabiliriz.

matrix2 <- rbind(matrix2, c(9, 11, 13))
matrix2
        Sutun 1 Sutun 2 Sutun 3
Satir 1      54       5      47
Satir 2      19      38      73
Satir 3      63       7      11
Satir 4      97       8      12
              9      11      13
matrix2 <- cbind(matrix2, c(8, 12, 16, 20, 24))
matrix2
        Sutun 1 Sutun 2 Sutun 3   
Satir 1      54       5      47  8
Satir 2      19      38      73 12
Satir 3      63       7      11 16
Satir 4      97       8      12 20
              9      11      13 24

Matrix Operasyonlari

Matrisler ustunde aritmetik islemler yapmak istiyorsak dikkat etmemiz gereken belli noktalar vardir.

Elementler ustunde 4 islem yapmak istiyorsak iki matrisin de boyutlari ayni olmali. Yani birinde 3 row varsa digerinde de 3 row, birinde 5 column varsa digerinde de 5 column olmali. Ancak matris carpimi yapiyorsak, yani elementler ustunden degil de matarisin kendisi ustunden islem yapiyorsak bir matristeki row sayisi digerindeki column sayisine ve birindeki column sayisi digerindeki row sayisina esit olmali.

mat_a <- matrix(1:4, nrow = 2)
mat_b <- matrix(5:8, nrow = 2)

Aritmetik islemler

Toplama

matrix_toplam <- mat_a + mat_b
matrix_toplam
     [,1] [,2]
[1,]    6   10
[2,]    8   12

Cikarma

matrix_cikarma <- mat_a - mat_b
matrix_cikarma
     [,1] [,2]
[1,]   -4   -4
[2,]   -4   -4

Carpma

matrix_carpma <- mat_a * mat_b
matrix_carpma
     [,1] [,2]
[1,]    5   21
[2,]   12   32

Bolme

matrix_bolme <- mat_a / mat_b
matrix_bolme
          [,1]      [,2]
[1,] 0.2000000 0.4285714
[2,] 0.3333333 0.5000000

Matrislerin row ve columnlarinin sayilarini transpose yaparak degistirebiliriz. Bu matrix carpimi yapmak icin isimize yarayacak.

matrix1
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
transpose_matrix <- t(matrix1)
transpose_matrix
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

Matrix Carpimi

Daha onceden de soyledigim gibi matris carpimi yapmak icin iki matrisin column sayilari row sayilariyla eslesmeli. Az once transpose ederek matrisimizin column ve rowlarini degistirmistik. Bu da bizim matris carpimi yapmamiza olanak sagliyor. Matris carpiminin olayi su. Iki matrisi carptigimiz zaman bir matrisimizde 5 row, diger matrisimizde 5 column oldugu icin elde edecegimiz matrix 5x5 olacak. Bu elde edecegimiz yeni 5x5 matrisin ilk rowunun ilk columundaki elementi hesaplamak icin hesaplamaya soktugumuz matrisin ilk satiri ile ikinci matrisin ilk sutunundaki elementleri carpip topluyoruz. Cikan sonucu oraya yaziyoruz. Sonrasinda her islem icin bu gerceklestiriliyor.

matrixcarpimi <- matrix1  %*% transpose_matrix
matrixcarpimi
     [,1] [,2] [,3] [,4]
[1,]   14   32   50   68
[2,]   32   77  122  167
[3,]   50  122  194  266
[4,]   68  167  266  365

Arrays

Ayni tip verinin tekli veya coklu boyutla store edilmesine yarar. Vektorler ozunde tek boyutlu arrayler olarak dusunulebilinir. Ancak array dedigimiz zaman genellikle birden fazla boyutlu veri tiplerinden bahsederiz. Vektorlerde ve matrislerde oldugu gibi arraylerde ayni veri tipinden olusmak zorundadir. Matrisleri arraylerin 2 boyutlu bir tipi olarak dusunmemiz de mumkundur. Arrayler ise 3 ve daha fazla boyuta sahip olabilirler. Diger array tipleri gibi burada da array icine girilen verilen ayni tipten olmak zorundadir.

Array olusturmak array komutunu kullaniriz. Burada 2 boyutlu ve matrislerden de aliskin oldugumuz bir goruntu var. Ancak arrayler birden fazla boyuta sahip olabilecegi icin farklari orada ortaya cikacak.

array1 <- array(1:6, dim = c(2, 3))
array1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Birden cok boyutta array yaratmak icin

array_3d <- array(1:12, dim = c(2, 3, 2), dimnames = 
                    list(c("Row1", "Row2"), c("Col1", 
                    "Col2", "Col3"), 
                    c("Matrix1", "Matrix2")))
array_3d
, , Matrix1

     Col1 Col2 Col3
Row1    1    3    5
Row2    2    4    6

, , Matrix2

     Col1 Col2 Col3
Row1    7    9   11
Row2    8   10   12

Burada matrixlerde oldugu gibi tekli elementlere rahatca ulasabiliriz. Tek yapmamiz gereken ucuncu bir sayi olarak hangi matrise ulasmak istedigimizi belirtmek. Bu en son eristigimiz kisma ayni zamanda layer de denir.

array_3d[1,3,2]
[1] 11

Data Frames

R’da programlama yapmiyorsak, sifirdan bir veri olusturmaya calismiyorsak veya denemeler yapmiyorsak en cok karsilacaganiz veri tipi bu. Excel, STATA gibi verileri R ile okumayi ilerde ogrenecegiz. Bu verileri okudugumuz zaman format Data Frame olacak. Ondan dolayi en cok karsilasilan ve bilnen format budur. Ayni zamanda R paketleri de data frame ile calismaya uygun yapilir.

Data frameleri arraylerin daha guclu bir formu olarak dusunebiliriz. Arraylerin aksine farkli veri tiplerini bulundurabilirler. Bu konudaki en iyi karsilastirma Excel Spreadsheetleri. Dataframeler Excel kullaniminin R’a getirilmis hali gibi. R’da bir veriyle calisacak ve ozellikle siyaset bilimi ve public policy gibi alanlarda bu %95 data frame olarak gelir. ANCAK her columndaki veri tipi ayni olmalidir. Farkli veri tipleri sadece farkli columnlarda olabilir.

Data framelerin bir onemli ozelligi her columnda ayni sayida row olmasi gerekliligidir. Eger yoksa verimizde NA dedigimiz degerler olur ve bir analiz yaparken bu degerler analize dahil olmaz.

Ayni zamanda data framelerde her column ismi farkli olmalidir. Ayni column ismi birden fazla sutune verilemez. Genel olarak sutunlara degiskenleri, rowlara ise observationlari koyariz.

Data frame olusturmak icin data.frame komutunu kullaniriz ve vektorler ile benzer bir mantik izleriz. Sonuc olarak vektorler bir boyutlu arraylerdir, data frame ise 2 boyutlu arraydir.

ornek_df <- data.frame(
  isim = c("Ece", "Onur", "Zeynep"),
  yas = c(28, 29, 27),
  kadin = c(TRUE, FALSE, TRUE)
)
ornek_df
    isim yas kadin
1    Ece  28  TRUE
2   Onur  29 FALSE
3 Zeynep  27  TRUE

Data framelerde verilere farkli sekillerde erisebiliriz. Ileride tidyverse paketi ile bunu nasil daha kolayca yapacagimizi gorecegiz ama simdilik base R ustunden komutlara bakacagiz.

Tek bir elementi almak icin

ornek_df[1,3]
[1] TRUE

Bir columnu ismini kullanarak almak icin

ornek_df[["isim"]]
[1] "Ece"    "Onur"   "Zeynep"

Birden fazla columna erismemiz de mumkun

ornek_df[, c("isim", "yas")]
    isim yas
1    Ece  28
2   Onur  29
3 Zeynep  27

Bu columnu almak icin bracketlar yerine dogrudan column ismini de $ operatoru ile alabiriz. Eger dataframe R environmentinda kayitliysa R Studio bunu otomatik olarak dolduracak ve isimizi kolaylastiracak.

ornek_df$isim
[1] "Ece"    "Onur"   "Zeynep"

Data framelere yeni bir column ekleyebiliriz

ornek_df$genc <- ornek_df$yas <= 25
ornek_df
    isim yas kadin  genc
1    Ece  28  TRUE FALSE
2   Onur  29 FALSE FALSE
3 Zeynep  27  TRUE FALSE

Yeni bir row da ekleyebiliriz

yeni_kisi <- data.frame(isim = "Mustafa", yas = 23, 
                        kadin = FALSE, genc = TRUE)
ornek_df <- rbind(ornek_df, yeni_kisi)
ornek_df
     isim yas kadin  genc
1     Ece  28  TRUE FALSE
2    Onur  29 FALSE FALSE
3  Zeynep  27  TRUE FALSE
4 Mustafa  23 FALSE  TRUE

Data frameler hakkindaki bilgileri goruntulemek icin

head(ornek_df)
     isim yas kadin  genc
1     Ece  28  TRUE FALSE
2    Onur  29 FALSE FALSE
3  Zeynep  27  TRUE FALSE
4 Mustafa  23 FALSE  TRUE
tail(ornek_df)
     isim yas kadin  genc
1     Ece  28  TRUE FALSE
2    Onur  29 FALSE FALSE
3  Zeynep  27  TRUE FALSE
4 Mustafa  23 FALSE  TRUE
nrow(ornek_df)
## [1] 4
ncol(ornek_df)
## [1] 4
str(ornek_df)
## 'data.frame':    4 obs. of  4 variables:
##  $ isim : chr  "Ece" "Onur" "Zeynep" "Mustafa"
##  $ yas  : num  28 29 27 23
##  $ kadin: logi  TRUE FALSE TRUE FALSE
##  $ genc : logi  FALSE FALSE FALSE TRUE

Data frameler ile dikkat etmemiz gereken bir nokta column isimlerinin anlamli olmasidir. Boylece kullanan kisi biz veya baskasi da olsak hangi sutundan ne aldigini anlayabilmeli. Daha onemli olan bir nokta ise ayni data frame ustune donusum islemleri yapilmamali ve eger bir veri ekleyip cikariyorsak veya degisiklikler yapiyorsak bunlari yeni bir dataframe olarak kaydetmek daha iyi olur. Verinin orijinal hali her zaman korunmali.

Ileride daha genis isleyecegiz ama data frameleri subset etmemiz de mumkun

kadin_df <- ornek_df[ornek_df$kadin == TRUE,]
kadin_df
    isim yas kadin  genc
1    Ece  28  TRUE FALSE
3 Zeynep  27  TRUE FALSE

Benzer sekilde row ve column cikarmamiz da mumkundur.

ornek_df_subset <- subset(ornek_df, yas != 27)
ornek_df_subset
     isim yas kadin  genc
1     Ece  28  TRUE FALSE
2    Onur  29 FALSE FALSE
4 Mustafa  23 FALSE  TRUE

Bunu endekse gore de yapabiliriz

ornek_df_subset2 <- ornek_df[-2, ]
ornek_df_subset2
     isim yas kadin  genc
1     Ece  28  TRUE FALSE
3  Zeynep  27  TRUE FALSE
4 Mustafa  23 FALSE  TRUE

Columnlarda isme gore

ornek_df_subset3 <- ornek_df[, !names(ornek_df) 
                             %in% "yas"]
ornek_df_subset3
     isim kadin  genc
1     Ece  TRUE FALSE
2    Onur FALSE FALSE
3  Zeynep  TRUE FALSE
4 Mustafa FALSE  TRUE

Columnlarda endekse gore

ornek_df_subset4 <- ornek_df[, -1]
ornek_df_subset4
  yas kadin  genc
1  28  TRUE FALSE
2  29 FALSE FALSE
3  27  TRUE FALSE
4  23 FALSE  TRUE

Istersek farkli data frameleri rowlara ve columnlara gore birlestirebiliriz

ornek_df2 <- data.frame(
  isim = c("Can", "Merve", "Berk"),
  yas = c(24, 31, 26),
  kadin = c(FALSE, TRUE, FALSE),
  genc = c(TRUE, FALSE, FALSE)
)

birlesik_df <- rbind(ornek_df2, ornek_df)
birlesik_df
     isim yas kadin  genc
1     Can  24 FALSE  TRUE
2   Merve  31  TRUE FALSE
3    Berk  26 FALSE FALSE
4     Ece  28  TRUE FALSE
5    Onur  29 FALSE FALSE
6  Zeynep  27  TRUE FALSE
7 Mustafa  23 FALSE  TRUE
ornek_df3 <- data.frame(
  boy = c(170, 172, 164, 183),
  kilo = c(60, 75, 55, 80)
)
birlesik_df2 <- cbind(ornek_df3, ornek_df)
birlesik_df2
  boy kilo    isim yas kadin  genc
1 170   60     Ece  28  TRUE FALSE
2 172   75    Onur  29 FALSE FALSE
3 164   55  Zeynep  27  TRUE FALSE
4 183   80 Mustafa  23 FALSE  TRUE

Data frameler ustunde aritmetik islem yapmamiz mumkundur. Elbet bunu butun dataframe ustunde degil de column bazli yapabiliriz.

ornek_df3$kilo <- ornek_df3$kilo * 2.205

Tibbles

Daha az kullanilsa bile R dataframelerinin daha basit ve modern bir sekli olarak dusunebiliriz. Ileride detaylica ogrenecegimiz tidyverse ekosistemi icinde bir veri tipi. Bu tipin bir avantaji column isimlerinin veri tipinin degismemesi. R bazen dataframelerde column isimlerindeki bosluklari noktalara degistiriyor. Eskiden verilerde bir string columnu aldigi zamansa onu otomatikman faktor yapiyordu. Tibble ise bunlari yapmadan veriyi oldugu gibi aliyor. Boylece beklenmedik errorlerin onune gecebiliyor.

Ayni zamanda veri setleriyle calisirken veri setini print ettigimiz durumda daha basit bir gorunum ile gosteriyor. Asil farkli 100lerce rowu olan daha buyuk veri setlerinde ortaya cikiyor. Cunku verisetini print ettigimiz zaman R 100 rowa kadar gosterebilirken Tibble bunu 10 ile sinirliyor.

library(tidyverse)
ornek_tibble <- tibble(
  isim = c("Ece", "Onur", "Zeynep"),
  yas = c(28, 39, 27),
  sehir = c("Paris", "Istanbul", "Luxembourg")
)
ornek_tibble
# A tibble: 3 × 3
  isim     yas sehir     
  <chr>  <dbl> <chr>     
1 Ece       28 Paris     
2 Onur      39 Istanbul  
3 Zeynep    27 Luxembourg

Elimizdeki dataframeleri tibble formatina donusturmek mumkun

ornek_tibble2 <- as_tibble(ornek_df)

Ayni dataframelerde oldugu gibi Tibble verilerine erisiyoruz.

ornek_tibble2[["yas"]]
[1] 28 29 27 23
ornek_tibble2$yas
[1] 28 29 27 23

Ayni listelerde oldugu gibi cift bracket kullanmaya dikkat etmeliyiz. Yoksa bize vektor degil de tibble verecektir.

ornek_tibble2[, "yas"]
## # A tibble: 4 × 1
##     yas
##   <dbl>
## 1    28
## 2    29
## 3    27
## 4    23

Tibble ustunde yapilacak tidyverse islemlerini ileryen donemde data frame kisminda inceleyecegiz. Tibble her ne kadar basit veri girislerinde ise yarayan bir format olsa bile dataframe hala temel format olma ozelligini koruyor. Internetten alacagimiz veriler de genelde data frame olarak alinacagi icin ve yukarida bahsettigim kucuk farklar haricinde ciddi bir avantaji olmadigi icin data frame temel odak noktamiz olacak.

SON