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.
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
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"
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"
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"
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
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")
}
## * * *
## * * *
## ***
## *******
## ***
## * * *
## * * *