Programlama günlüğümde tüm konunun teorik olarak özetini yaptığım için bu günlükte alıştırmalar yapmak istedim. Bazı kodları aklımdan yazmaya çalıştım ve bazılarını da birbiriyle kıyaslayıp çıkarım yaparak yazmaya çalıştım.

Alıştırma 1: Fonksiyon tanımlama

bagil_deg <- function(dagilim) {
  (sd(dagilim) / mean(dagilim)) * 100
}

set.seed geçen dersin sayısı olarak yine 40 olsun.

set.seed(40)
x <- rnorm(100, mean = 50, sd = 10)

bagil_deg(x)
## [1] 19.90825
bagil_deg # parantez olmadan yazınca fonksiyonun içeriğini görürüz ama çalışmaz
## function (dagilim) 
## {
##     (sd(dagilim)/mean(dagilim)) * 100
## }
set.seed(40)
v1 <- rnorm(100, 50, 5)
v2 <- rnorm(100, 50, 10)
v3 <- rnorm(100, 50, 20)

veriler <- list(v1, v2, v3)
# birçok vektörü lapply ile tek seferde çalıştırabiliriz.
lapply(veriler, bagil_deg) #arka planda şöyle bir senaryo çalışıyor: bagil_deg(v1), bagil_deg(v2), bagil_deg(v3)
## [[1]]
## [1] 10.01973
## 
## [[2]]
## [1] 21.54197
## 
## [[3]]
## [1] 36.50523

Alıştırma 2: Koşullu ifadeler

Bağıl değişkenlik katsayısının değerini sınıflandırmak için koşullu ifadeleri kullanabiliriz.

V <- 23

if (V >= 25) {
  print("Normalden Basık Dağılım")
} else if (V >= 20) {
  print("Normal Dağılım Orta Düzeyde")
} else {
  print("Normalden Sivri Dağılım")
}
## [1] "Normal Dağılım Orta Düzeyde"

Alıştırma 3: İterasyonlar - Döngüler

for döngüsü

aylar <- c("ocak", "şubat", "mart", "nisan", "mayıs", "haziran", "temmuz", "ağustos", "eylül", "ekim", "kasım", "aralık")

for (i in 1:12){
  print (aylar[i])
}
## [1] "ocak"
## [1] "şubat"
## [1] "mart"
## [1] "nisan"
## [1] "mayıs"
## [1] "haziran"
## [1] "temmuz"
## [1] "ağustos"
## [1] "eylül"
## [1] "ekim"
## [1] "kasım"
## [1] "aralık"
for (i in 1:3) {
  print (aylar [1:5]) 
} #bunları aklımdan yazabildim 😇
## [1] "ocak"  "şubat" "mart"  "nisan" "mayıs"
## [1] "ocak"  "şubat" "mart"  "nisan" "mayıs"
## [1] "ocak"  "şubat" "mart"  "nisan" "mayıs"

while döngüsü

yukarıdaki örneği while döngüsü ile yapmaya çalışalım.

i <- 1
while (i <= length(aylar)) {
  print(aylar[i])
  i <- i + 1
}
## [1] "ocak"
## [1] "şubat"
## [1] "mart"
## [1] "nisan"
## [1] "mayıs"
## [1] "haziran"
## [1] "temmuz"
## [1] "ağustos"
## [1] "eylül"
## [1] "ekim"
## [1] "kasım"
## [1] "aralık"

Alıştırma 4: Veri manipülasyonu

Hatırlamak için notlarımıza bakalım:

lapply(): Bir liste üzerinde döngü kurar ve her elemana bir fonksiyon uygular, sonuç olarak bir liste döndürür.

sapply(): lapply() ile aynı işlevi görür ancak çıktıyı mümkün olduğunca basitleştirir (vektör veya matris gibi).

apply(): Bir matris veya dizinin satır ya da sütunları üzerinde bir fonksiyon çalıştırır.

tapply(): Bir vektörü faktörlere göre gruplara ayırır ve her grup üzerinde bir fonksiyon uygular.

mapply(): lapply() fonksiyonunun çok değişkenli versiyonudur, birden fazla veri yapısı üzerinde paralel olarak çalışır.

split(): Veri yapılarını bir faktöre göre alt kümelere ayırmak için kullanılan bir yardımcı fonksiyondur.

lapply(1:4, runif) 
## [[1]]
## [1] 0.1800361
## 
## [[2]]
## [1] 0.4942280 0.1232649
## 
## [[3]]
## [1] 0.7759401 0.8254665 0.1981371
## 
## [[4]]
## [1] 0.06565191 0.52076798 0.93610327 0.55758358
# 0 ile 1 arasında 1 değer
# 0 ile 1 arasında 2 değer
# 0 ile 1 arasında 3 değer
# 0 ile 1 arasında 4 değer
set.seed(40)
lapply(1:3, runif, min =10, max=20) # 10 ile 20 arasında 1,2,3 tane sayı üretti
## [[1]]
## [1] 16.83582
## 
## [[2]]
## [1] 18.72904 16.90117
## 
## [[3]]
## [1] 11.15936 11.95009 14.61201
lapply(1:3, runif, min =1:3, max=10:12) # min ve max değerleri değişen 1,2,3 tane sayı üretti
## [[1]]
## [1] 2.831817
## 
## [[2]]
## [1] 6.317643 5.364993
## 
## [[3]]
## [1] 2.271683 2.865403 9.325865
set.seed(40)
sapply(1:3, runif, min = 10, max = 20) #her defasında farklı uzunlukta veri ürettiği için sapply tıpkı lapply gibi davrandı. bunu değiştirmek için her döngüde aynı uzunlukta veri üretmesini sağlayacağım
## [[1]]
## [1] 16.83582
## 
## [[2]]
## [1] 18.72904 16.90117
## 
## [[3]]
## [1] 11.15936 11.95009 14.61201
set.seed(40)
sapply(1:3, function(x) mean(runif(3, 10, 20))) # runif (3, 10, 20) yaparak bunu sağladım
## [1] 17.48868 12.57382 13.89424

derste iris veri setini kullanmıştık, şimdi ben başka bir veri setini kullanacağım ve ilk akla gelenlerden biri mtcars tabi ki

mtcars_group <- split(mtcars, mtcars$cyl) #silindire göre gruplama yaptı

lapply(mtcars_group, function(x) {
  mean(x$mpg)
})
## $`4`
## [1] 26.66364
## 
## $`6`
## [1] 19.74286
## 
## $`8`
## [1] 15.1
lapply(mtcars_group, summary)
## $`4`
##       mpg             cyl         disp              hp              drat      
##  Min.   :21.40   Min.   :4   Min.   : 71.10   Min.   : 52.00   Min.   :3.690  
##  1st Qu.:22.80   1st Qu.:4   1st Qu.: 78.85   1st Qu.: 65.50   1st Qu.:3.810  
##  Median :26.00   Median :4   Median :108.00   Median : 91.00   Median :4.080  
##  Mean   :26.66   Mean   :4   Mean   :105.14   Mean   : 82.64   Mean   :4.071  
##  3rd Qu.:30.40   3rd Qu.:4   3rd Qu.:120.65   3rd Qu.: 96.00   3rd Qu.:4.165  
##  Max.   :33.90   Max.   :4   Max.   :146.70   Max.   :113.00   Max.   :4.930  
##        wt             qsec             vs               am        
##  Min.   :1.513   Min.   :16.70   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:1.885   1st Qu.:18.56   1st Qu.:1.0000   1st Qu.:0.5000  
##  Median :2.200   Median :18.90   Median :1.0000   Median :1.0000  
##  Mean   :2.286   Mean   :19.14   Mean   :0.9091   Mean   :0.7273  
##  3rd Qu.:2.623   3rd Qu.:19.95   3rd Qu.:1.0000   3rd Qu.:1.0000  
##  Max.   :3.190   Max.   :22.90   Max.   :1.0000   Max.   :1.0000  
##       gear            carb      
##  Min.   :3.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:1.000  
##  Median :4.000   Median :2.000  
##  Mean   :4.091   Mean   :1.545  
##  3rd Qu.:4.000   3rd Qu.:2.000  
##  Max.   :5.000   Max.   :2.000  
## 
## $`6`
##       mpg             cyl         disp             hp             drat      
##  Min.   :17.80   Min.   :6   Min.   :145.0   Min.   :105.0   Min.   :2.760  
##  1st Qu.:18.65   1st Qu.:6   1st Qu.:160.0   1st Qu.:110.0   1st Qu.:3.350  
##  Median :19.70   Median :6   Median :167.6   Median :110.0   Median :3.900  
##  Mean   :19.74   Mean   :6   Mean   :183.3   Mean   :122.3   Mean   :3.586  
##  3rd Qu.:21.00   3rd Qu.:6   3rd Qu.:196.3   3rd Qu.:123.0   3rd Qu.:3.910  
##  Max.   :21.40   Max.   :6   Max.   :258.0   Max.   :175.0   Max.   :3.920  
##        wt             qsec             vs               am        
##  Min.   :2.620   Min.   :15.50   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:2.822   1st Qu.:16.74   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :3.215   Median :18.30   Median :1.0000   Median :0.0000  
##  Mean   :3.117   Mean   :17.98   Mean   :0.5714   Mean   :0.4286  
##  3rd Qu.:3.440   3rd Qu.:19.17   3rd Qu.:1.0000   3rd Qu.:1.0000  
##  Max.   :3.460   Max.   :20.22   Max.   :1.0000   Max.   :1.0000  
##       gear            carb      
##  Min.   :3.000   Min.   :1.000  
##  1st Qu.:3.500   1st Qu.:2.500  
##  Median :4.000   Median :4.000  
##  Mean   :3.857   Mean   :3.429  
##  3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :6.000  
## 
## $`8`
##       mpg             cyl         disp             hp             drat      
##  Min.   :10.40   Min.   :8   Min.   :275.8   Min.   :150.0   Min.   :2.760  
##  1st Qu.:14.40   1st Qu.:8   1st Qu.:301.8   1st Qu.:176.2   1st Qu.:3.070  
##  Median :15.20   Median :8   Median :350.5   Median :192.5   Median :3.115  
##  Mean   :15.10   Mean   :8   Mean   :353.1   Mean   :209.2   Mean   :3.229  
##  3rd Qu.:16.25   3rd Qu.:8   3rd Qu.:390.0   3rd Qu.:241.2   3rd Qu.:3.225  
##  Max.   :19.20   Max.   :8   Max.   :472.0   Max.   :335.0   Max.   :4.220  
##        wt             qsec             vs          am              gear      
##  Min.   :3.170   Min.   :14.50   Min.   :0   Min.   :0.0000   Min.   :3.000  
##  1st Qu.:3.533   1st Qu.:16.10   1st Qu.:0   1st Qu.:0.0000   1st Qu.:3.000  
##  Median :3.755   Median :17.18   Median :0   Median :0.0000   Median :3.000  
##  Mean   :3.999   Mean   :16.77   Mean   :0   Mean   :0.1429   Mean   :3.286  
##  3rd Qu.:4.014   3rd Qu.:17.55   3rd Qu.:0   3rd Qu.:0.0000   3rd Qu.:3.000  
##  Max.   :5.424   Max.   :18.00   Max.   :0   Max.   :1.0000   Max.   :5.000  
##       carb     
##  Min.   :2.00  
##  1st Qu.:2.25  
##  Median :3.50  
##  Mean   :3.50  
##  3rd Qu.:4.00  
##  Max.   :8.00

her sütuna uygulanabilecek bir fonksiyon kullandığımızda -örneğin summary gibi- isimsiz/anonim fonksiyon kullanmaya gerek yok ama mean yazsaydım hata verecekti/verdi

# split ve lapply fonksiyonlarının yaptığı işlemi tek seferde tapply ile deneyeceğim
tapply(mtcars$mpg, mtcars$cyl, summary)
## $`4`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.40   22.80   26.00   26.66   30.40   33.90 
## 
## $`6`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   17.80   18.65   19.70   19.74   21.00   21.40 
## 
## $`8`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   10.40   14.40   15.20   15.10   16.25   19.20
# tapply çıktısının görünüş olarak biraz farklı halini by ile yapabiliriz
by(mtcars$mpg, mtcars$cyl, summary)
## mtcars$cyl: 4
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.40   22.80   26.00   26.66   30.40   33.90 
## ------------------------------------------------------------ 
## mtcars$cyl: 6
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   17.80   18.65   19.70   19.74   21.00   21.40 
## ------------------------------------------------------------ 
## mtcars$cyl: 8
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   10.40   14.40   15.20   15.10   16.25   19.20
set.seed(40)

mapply(rnorm, 1:5, 1:5, 2)
## [[1]]
## [1] 1.955478
## 
## [[2]]
## [1] 2.9923656 0.2808314
## 
## [[3]]
## [1] 1.3418801 2.3568538 0.3924592
## 
## [[4]]
## [1] 1.157027 7.489830 3.423441 1.382269
## 
## [[5]]
## [1] 4.861096 2.550147 6.617993 4.015699 5.905388
# bu örnekte mapply şunu yapsın istedik (rnorm, mean, sd)
# rnorm(1, mean = 1, sd = 2)
# rnorm(2, mean = 2, sd = 2)
# rnorm(3, mean = 3, sd = 2)
# rnorm(4, mean = 4, sd = 2)
# rnorm(5, mean = 5, sd = 2)
# tüm bu işlemi tek seferde yaptı

Şimdi ben mapply fonksiyonunu aylarla çalıştırmaya çalışacağım.

mapply(
  function(aylar, sira) {
    paste(sira, ":", aylar)
  },
  aylar,
  1:length (aylar) # burada length yerine 12 yazdığımda çalışmadı
)
##          ocak         şubat          mart         nisan         mayıs 
##    "1 : ocak"   "2 : şubat"    "3 : mart"   "4 : nisan"   "5 : mayıs" 
##       haziran        temmuz       ağustos         eylül          ekim 
## "6 : haziran"  "7 : temmuz" "8 : ağustos"   "9 : eylül"   "10 : ekim" 
##         kasım        aralık 
##  "11 : kasım" "12 : aralık"
mapply(
  function(aylar, sira) {
    paste(sira, ":", aylar)
  },
  aylar,
  1:12 # bu şekilde yapınca aynısı çalışıyor
)
##          ocak         şubat          mart         nisan         mayıs 
##    "1 : ocak"   "2 : şubat"    "3 : mart"   "4 : nisan"   "5 : mayıs" 
##       haziran        temmuz       ağustos         eylül          ekim 
## "6 : haziran"  "7 : temmuz" "8 : ağustos"   "9 : eylül"   "10 : ekim" 
##         kasım        aralık 
##  "11 : kasım" "12 : aralık"

Bu dersten unutulmaması gerekenlerin bir kısmını buraya ekliyorum:

📍 fonksiyonları parantez olmadan yazınca içeriğini görürsün

📍 runif random sayı üreticisidir - uniform tek düze demektir

📍 lapply söz dizimi: nesne, fonksiyon, devamında fonksiyonun argümanları eklenebilir

📍 split group_by gibi çalışır

📍 gl () faktör üretme fonksiyonu

📍 datayı açınca filter ile sürekli verilerin dağılımını görebilirsin

📍 lapply içinde colMeans kullanmak için isimsiz bir fonksiyon tanımlamak gerekir

📍 mean ve sd farklı olan grupları karşılaştırmak için bağıl değişkenlik katsayısı kullanılır

📍 rep (1, 2) demek 1’i 2 kere tekrarla demek

📍 list(rep(1, 4), rep(2, 3), rep(3, 2), rep(4, 1)) yerine mapply(rep, 1:4, 4:1) bunu kullanabiliriz

Alıştırma 5: Kar tanesi ❄️

Kış temalı bir alıştırmayla bitirmek istiyorum. ❄️

Bunu yapmak için şekilli olan kodları inceledim.

Anladıklarım şunlar:

n matrisin boyutu demek

for (i in 1:n) ve for (j in 1:n) satır ve sütunu gösteriyor

cat (“*”) yıldız yazdırıyor

cat (” “) boşluk bırakıyor

cat (“”) alt satıra iniyor

biçimsiz birtakım şekillerden sonra gpt eksik yerleri gösterdi.

n <-7 
mid <- ceiling(n/2)

for (i in 1:n) {
  for (j in 1:n) {
    if (i == mid || j == mid || abs(i - mid) == abs(j - mid)) {
      cat("*")
    } else {
      cat(" ")
    }
  }
  cat("\n")
}
## *  *  *
##  * * * 
##   ***  
## *******
##   ***  
##  * * * 
## *  *  *