ÖNEMLİ NOT!!!: Hocam geçen haftaki ödevleri ben yapmıştım geçen hafta yayınladığım Rpubs dosyasında (2 Aralık Dersi Ödevi) bulabilirsiniz, ona da bakın lütfen, bu ödev 9 Aralık dersi öğrendiklerimize ilişkin ödevdir.
R’da … Argümanı
Fonksiyon tanımlarında kullanılan … operatörü, sayısı veya ismi önceden bilinmeyen argümanların fonksiyona kabul edilmesini sağlayan bir esneklik aracıdır.
Bir fonksiyonun içine gömülen başka bir temel fonksiyona (örneğin plot), kullanıcının girdiği ek parametreleri (renk, etiket vb.) değiştirmeden iletmek için kullanılır.
paste(), cat() veya sum() gibi fonksiyonlarda olduğu gibi, kullanıcının kaç tane veri gireceğinin (1 tane de olabilir, 100 tane de) belli olmadığı durumlarda tüm girdileri yakalamak için kullanılır.
… argümanından sonra gelen argümanlar (örneğin paste fonksiyonundaki sep argümanı) çok katı kurallara tabidir:
Tam İsim Zorunluluğu: Argümanın adı eksiksiz yazılmalıdır (sep = “:” gibi).
Kısmi Eşleşme Yoktur: R, se = “:” gibi kısaltmaları tanımaz, bunları verinin bir parçası sanar.
args(paste)
## function (..., sep = " ", collapse = NULL, recycle0 = FALSE)
## NULL
args(plot)
## function (x, y, ...)
## NULL
Çoklu veri seti oluşturma ve dışarı aktarma
Derste otomatik olarak artan boyutlarda veri setleri üreten ve bunları Excel dosyası olarak kaydeden bir fonksiyon oluşturmuştuk:
df<-list()
veri_sim<- function(tekrar=1, satir,sutun){
for(i in 1:tekrar){
set.seed(i)
df[[i]]<- data.frame(matrix(sample(1:100,satir[i]*sutun[i],replace=TRUE), nrow=satir[i], ncol=sutun[i]))
writexl::write_xlsx(df[[i]], paste("sim/veri_",i,".xlsx",sep=""))
}
}
veri_sim(tekrar=15,satir=1:15, sutun=1:15)
While For döngüsünün aksine, tekrar sayısının baştan belli olmadığı durumlarda kullanılır.
AKIŞ: Koşulu kontrol et.
Koşul Doğru (TRUE) ise süslü parantez { } içindeki kodları çalıştır.
Tekrar başa dön ve koşulu kontrol et.
Koşul Yanlış (FALSE) olduğu anda döngü biter.
Sonsuz döngü tehlikesi olduğundan, döngünün içinde, koşulu değiştirecek bir hamle (artırma/azaltma gibi) mutlaka yapılmalıdır.
Birden fazla koşul && (ve) operatörü ile bağlanabilir.
R, koşulları soldan sağa doğru değerlendirir. Eğer soldaki ilk koşul sağlanmıyorsa, sağdakine bakmaya gerek duymaz ve döngüden çıkar.
Repeat While döngüsünden farkı, hiçbir koşula bakmadan doğrudan döngüyü başlatmasıdır.
Döngü sonsuzdur.
Durdurmanın tek yolu, döngü içine bir if koşulu yazıp break komutunu kullanmaktır.
Genellikle matematiksel hesaplamalarda, bir sonuca yakınsayana kadar (iterasyon) işlem yapmak gerektiğinde kullanılır.
Eğer aradığın sonuca asla ulaşılamazsa (sayılar bir ileri bir geri giderse), bu döngü asla durmaz.
Bu yüzden genellikle repeat yerine, maksimum deneme sayısı belli olan bir for döngüsü kullanmayı tercih ederler.
Adımlar
Hepsini Çarp: Elindeki vektörün içindeki tüm sayıları birbirleriyle çarp.
Adedi Bul: Vektörün içinde kaç tane sayı olduğunu (uzunluğunu) bul.
Kökünü Al: Bulduğun çarpım sonucunun, sayı adedi (n) derecesinden kökünü al.
geom_ort<- function(x){
if(any(x<=0)) {
stop("HATA:Geometrik ortalama hesaplanacak tüm değerler pozitif olmalıdır.")
}
carpım<- prod(x) # prod(): tüm elemanları tek seferde çarpan fonksiyon
n<- length(x)
sonuc<- carpım^(1/n) # Bir sayının n. dereceden kökünü almak, o sayının (1/n). kuvvetini (üssünü) almak demektir.
return(sonuc)
}
Deneme
x<-c(seq(10,100,5))
y<-c(seq(-100,0,10))
geom_ort(x)
## [1] 46.41526
Soru 1
For döngüsü ile boş bir veri setinin sütunlarını farklı şekillerde oluşturma (Toplam 7 sütun oluşturacağız: 3 Kategorik + 4 Sürekli)
n_gozlem <- 10
df <- data.frame(row.names = 1:n_gozlem)
# Döngü: Toplam 7 sütun (3 Kategorik + 4 Sürekli)
for (i in 1:7) {
if (i <= 3) {
# İLK 3 SÜTUN: Kategorik (Örn: A, B, C grupları)
# sample() fonksiyonu rastgele harf seçer.
df[, i] <- sample(c("Grup A", "Grup B", "Grup C"), n_gozlem, replace = TRUE)
} else {
# DİĞER 4 SÜTUN: Sürekli (Örn: Normal dağılım sayıları)
# rnorm() fonksiyonu rastgele sayı üretir.
df[, i] <- rnorm(n_gozlem, mean = 50, sd = 10)
}
# Sütunlara isim verme
colnames(df)[i] <- paste0("Degisken_", i)
}
# 4. Sonuç
print(df)
## Degisken_1 Degisken_2 Degisken_3 Degisken_4 Degisken_5 Degisken_6 Degisken_7
## 1 Grup A Grup B Grup A 48.57530 50.66142 41.96633 63.30205
## 2 Grup B Grup A Grup B 29.09912 47.06808 70.73553 55.76156
## 3 Grup A Grup B Grup C 28.40910 26.94999 60.29190 43.88013
## 4 Grup C Grup C Grup C 51.97552 51.10988 58.76848 43.27981
## 5 Grup A Grup B Grup A 45.50330 56.07185 65.96813 62.82784
## 6 Grup A Grup B Grup B 38.06780 44.81115 53.61630 50.21979
## 7 Grup A Grup C Grup A 58.51746 54.20784 60.14646 62.94419
## 8 Grup C Grup B Grup A 36.72620 47.06479 57.16543 35.07579
## 9 Grup C Grup A Grup C 50.66642 67.72533 38.54691 29.11561
## 10 Grup C Grup C Grup B 49.85820 48.91217 39.90958 36.82123
Sanal Sınıf ve Sınav Notu Oluşturma Fonksiyonu (Ekstra deneme)
df<-list()
sanal_sinif<- function(sinif_sayisi=1){
for(i in 1:sinif_sayisi){
set.seed(i)
n <- sample(10:30, 1)
df[[i]] <- data.frame(
Ogrenci_No = 1:n, # 1'den n'e kadar sayı
Cinsiyet = sample(c("Kadin", "Erkek"), n, replace=TRUE), # n tane cinsiyet
Sinav_Puani = round(rnorm(n, mean=70, sd=10))# n tane not
)
writexl::write_xlsx(df[[i]], paste0("sinif_",i,".xlsx"))
}
}
sanal_sinif(sinif_sayisi=5)
Soru 2
Tüm verileri 0 olan farklı boyutlarda veri setleri oluşturup bu veri setlerini çalışma alanında yazdırma
liste1<-list()
bos_veri<- function(tekrar=1, satir, sutun)
{for(i in 1:tekrar) {
liste1[[i]]<- data.frame(matrix(0, nrow=satir[i], ncol=sutun[i]))
writexl::write_xlsx(liste1[[i]], paste0("liste_", i, ".xlsx"))
}
}
bos_veri(tekrar=3, satir=c(3, 10, 50), sutun=c(2, 2, 5))
Soru 3
For döngüsü ile liste kullanımı anlamak için PISA veri setinden farklı boyutlarda veri setleri çekip bu veri setlerini çalışma alanına yazdırma
pisa_2022_tur_full <- readRDS("pisa_2022_tur_full.rds")
veri_parcalayici<- function(veri,kesilecek_miktar) {
sonuc_listesi<-list()
for(i in 1:length(kesilecek_miktar)) {
hedef_sayi<-kesilecek_miktar[i]
kesilen_veri <- veri[1:hedef_sayi, ]
sonuc_listesi[[i]] <- kesilen_veri
writexl::write_xlsx(sonuc_listesi[[i]], paste0("Pisa_Verisi_", hedef_sayi, "_Satir_Parca_", i, ".xlsx"))
}
return(sonuc_listesi)
}
sonuclar<- veri_parcalayici(pisa_2022_tur_full, 10)
sonuclar[[1]]
Soru 4
For döngüsü ile çalışma alanlarındaki veri setlerini okuyup, her bir bir seti için özet bilgileri bir listede saklama
veri_ozetle <- function(tekrar) {
ozetler <- list()
for(i in 1:tekrar) {
gecici_veri <- readxl::read_excel(paste0("sim/veri_", i, ".xlsx") )
ozetler[[i]] <- summary(gecici_veri)
}
return(ozetler)
}
sonuc_listesi <- veri_ozetle(15)
# 15. dosyanın özetine bakmak için:
print(sonuc_listesi[[15]])
## X1 X2 X3 X4 X5
## Min. : 5.0 Min. : 2.00 Min. : 2.00 Min. : 6.00 Min. : 8.0
## 1st Qu.:29.5 1st Qu.:32.00 1st Qu.:30.00 1st Qu.:37.00 1st Qu.:20.5
## Median :38.0 Median :58.00 Median :58.00 Median :49.00 Median :44.0
## Mean :47.6 Mean :55.53 Mean :50.67 Mean :55.93 Mean :44.8
## 3rd Qu.:71.0 3rd Qu.:82.00 3rd Qu.:74.50 3rd Qu.:78.00 3rd Qu.:62.5
## Max. :89.0 Max. :99.00 Max. :95.00 Max. :98.00 Max. :95.0
## X6 X7 X8 X9 X10
## Min. : 6.00 Min. : 5.0 Min. : 3.0 Min. : 2.00 Min. : 3.00
## 1st Qu.:28.00 1st Qu.:18.0 1st Qu.:28.0 1st Qu.: 19.00 1st Qu.:28.00
## Median :47.00 Median :40.0 Median :64.0 Median : 47.00 Median :51.00
## Mean :47.93 Mean :44.8 Mean :50.2 Mean : 46.13 Mean :53.33
## 3rd Qu.:65.50 3rd Qu.:69.5 3rd Qu.:71.5 3rd Qu.: 79.50 3rd Qu.:82.00
## Max. :98.00 Max. :90.0 Max. :87.0 Max. :100.00 Max. :96.00
## X11 X12 X13 X14 X15
## Min. : 8.00 Min. :15.00 Min. : 1.00 Min. : 6.0 Min. : 7.00
## 1st Qu.:15.50 1st Qu.:34.00 1st Qu.:39.50 1st Qu.:32.5 1st Qu.:38.00
## Median :42.00 Median :61.00 Median :57.00 Median :40.0 Median :51.00
## Mean :43.93 Mean :58.27 Mean :57.53 Mean :45.6 Mean :51.87
## 3rd Qu.:73.00 3rd Qu.:79.50 3rd Qu.:79.50 3rd Qu.:55.5 3rd Qu.:64.50
## Max. :94.00 Max. :99.00 Max. :93.00 Max. :96.0 Max. :85.00
Soru 1 ve soru 2 sınıfta çözülmüştü.
Soru 3.
Örnek veri seti oluşturma kodları sorda verilmiş:
set.seed(1786)
ornek<-exp(matrix(rnorm(2000),nrow=100))
index1.temp<-sample(1:100,10)
index2.temp<-sample(1:20,10)
for(i in 1:10){
ornek[index1.temp[i],index2.temp[i]]<--1
}
head(ornek,6)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] 0.5549525 0.3247338 0.5236032 0.3821027 0.4187483 0.1588847 5.226161
## [2,] 0.5671734 1.2431592 0.8812069 2.6695443 0.6984453 1.0838792 1.079946
## [3,] 4.8068457 0.3449856 0.6079096 0.9194116 1.5361330 1.9082522 0.671977
## [4,] 1.3509234 2.3569582 0.1931423 4.0707377 0.3527276 2.3498825 1.198514
## [5,] 0.9012032 0.2310683 0.2317487 1.3809955 0.9168741 0.6237213 1.609403
## [6,] 1.2331483 1.1066056 0.3546027 0.3705946 0.9002303 0.2528151 3.337512
## [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,] 2.6280057 1.2251526 0.4760966 5.2379018 1.4782655 1.3761338 1.0202608
## [2,] 2.2087385 0.5195551 0.3757409 0.9004808 0.7409205 2.0543842 0.3668661
## [3,] 1.5310016 0.6735007 2.2069776 0.5060078 0.7171477 1.2378655 0.3651527
## [4,] 2.5592899 1.8205257 1.2624052 0.1524106 0.3828322 1.2406799 0.7954326
## [5,] 1.1005990 1.0619758 2.1047783 2.7816902 1.4010878 0.6140937 0.5136842
## [6,] 0.9799103 2.7520425 2.5407624 1.3889136 0.4346808 1.0637950 0.1859157
## [,15] [,16] [,17] [,18] [,19] [,20]
## [1,] 0.1437680 4.1807643 1.7389423 3.0760640 1.550557 4.4838291
## [2,] 3.8674407 1.9349214 0.6333922 0.4862532 5.275571 0.1161029
## [3,] 1.4724240 0.5971116 11.5869157 0.7580736 4.755297 1.0583051
## [4,] 0.1243085 0.8376231 1.3723291 2.0884571 2.506128 1.2094517
## [5,] 6.2971803 0.8422164 1.5335222 0.3079718 2.729447 1.7164885
## [6,] 3.8052219 2.1611055 0.3280288 2.7773368 1.726558 1.3193446
Yapılacaklar : ornek veri setinde i. satırda negatif sayı yok ise çıktıda i. satırın ortalaması….dir yazsin.
Eğer veri setinde herhangi bir satırda negatif sayı var ise satır i negatif sayı bulunmaktadır.
veri setindeki satırlardaki toplam negatif sayı toplamı üçü geçerse çktıda cok sayıda negatif sayı yazsın ve döngü çalışmayı durdursun.
for(i in 1:nrow(ornek)) {
negatif_sayisi <- sum(ornek[i, ] < 0)
if(negatif_sayisi > 3){
cat("Satir", i, "cok sayida negatif sayi icermektedir. Dongu durduruldu.\n")
break
}
if(negatif_sayisi > 0){
cat("Satir", i, "negatif sayi icermektedir.\n")
} else {
cat("Satir", i, "ortalamasi", mean(ornek[i, ]), "\n")
}
}
## Satir 1 ortalamasi 1.810246
## Satir 2 ortalamasi 1.385186
## Satir 3 ortalamasi 1.913065
## Satir 4 ortalamasi 1.411238
## Satir 5 ortalamasi 1.444987
## Satir 6 ortalamasi 1.450956
## Satir 7 ortalamasi 1.283952
## Satir 8 ortalamasi 1.092563
## Satir 9 ortalamasi 1.423682
## Satir 10 negatif sayi icermektedir.
## Satir 11 ortalamasi 1.638674
## Satir 12 negatif sayi icermektedir.
## Satir 13 ortalamasi 1.470122
## Satir 14 ortalamasi 1.68761
## Satir 15 ortalamasi 1.515547
## Satir 16 ortalamasi 1.995183
## Satir 17 ortalamasi 1.479423
## Satir 18 ortalamasi 1.444495
## Satir 19 ortalamasi 1.543788
## Satir 20 ortalamasi 2.179839
## Satir 21 ortalamasi 1.48708
## Satir 22 ortalamasi 2.109184
## Satir 23 ortalamasi 2.537019
## Satir 24 negatif sayi icermektedir.
## Satir 25 negatif sayi icermektedir.
## Satir 26 ortalamasi 0.9815739
## Satir 27 ortalamasi 2.101201
## Satir 28 ortalamasi 1.587085
## Satir 29 ortalamasi 2.079341
## Satir 30 ortalamasi 1.628384
## Satir 31 ortalamasi 1.062133
## Satir 32 ortalamasi 1.301769
## Satir 33 ortalamasi 1.227166
## Satir 34 ortalamasi 1.680898
## Satir 35 ortalamasi 2.04331
## Satir 36 ortalamasi 1.620427
## Satir 37 ortalamasi 1.495115
## Satir 38 negatif sayi icermektedir.
## Satir 39 ortalamasi 1.649573
## Satir 40 negatif sayi icermektedir.
## Satir 41 ortalamasi 1.610874
## Satir 42 ortalamasi 2.512928
## Satir 43 ortalamasi 1.292538
## Satir 44 ortalamasi 0.9953383
## Satir 45 ortalamasi 1.063196
## Satir 46 ortalamasi 2.08723
## Satir 47 ortalamasi 1.638381
## Satir 48 ortalamasi 1.587481
## Satir 49 ortalamasi 1.360392
## Satir 50 ortalamasi 2.503081
## Satir 51 negatif sayi icermektedir.
## Satir 52 ortalamasi 1.170185
## Satir 53 ortalamasi 1.399327
## Satir 54 ortalamasi 0.8518139
## Satir 55 ortalamasi 1.388742
## Satir 56 ortalamasi 1.288191
## Satir 57 ortalamasi 2.405831
## Satir 58 ortalamasi 0.9549096
## Satir 59 ortalamasi 1.372126
## Satir 60 ortalamasi 1.382571
## Satir 61 ortalamasi 1.133602
## Satir 62 ortalamasi 0.7106791
## Satir 63 ortalamasi 1.018546
## Satir 64 negatif sayi icermektedir.
## Satir 65 ortalamasi 1.159658
## Satir 66 ortalamasi 0.8425556
## Satir 67 ortalamasi 1.350846
## Satir 68 ortalamasi 1.14464
## Satir 69 ortalamasi 1.315107
## Satir 70 ortalamasi 1.602467
## Satir 71 ortalamasi 1.9137
## Satir 72 ortalamasi 2.177261
## Satir 73 ortalamasi 1.150917
## Satir 74 ortalamasi 3.378813
## Satir 75 ortalamasi 1.445871
## Satir 76 ortalamasi 1.65785
## Satir 77 ortalamasi 1.11154
## Satir 78 ortalamasi 1.663698
## Satir 79 ortalamasi 1.372642
## Satir 80 ortalamasi 1.455401
## Satir 81 ortalamasi 1.154774
## Satir 82 ortalamasi 3.348687
## Satir 83 ortalamasi 2.635185
## Satir 84 ortalamasi 1.3548
## Satir 85 ortalamasi 1.95681
## Satir 86 negatif sayi icermektedir.
## Satir 87 ortalamasi 1.450208
## Satir 88 ortalamasi 1.150915
## Satir 89 ortalamasi 1.255246
## Satir 90 ortalamasi 0.763787
## Satir 91 ortalamasi 1.2954
## Satir 92 negatif sayi icermektedir.
## Satir 93 ortalamasi 1.23735
## Satir 94 ortalamasi 2.151894
## Satir 95 ortalamasi 1.48521
## Satir 96 ortalamasi 1.569037
## Satir 97 ortalamasi 1.749064
## Satir 98 ortalamasi 2.91383
## Satir 99 ortalamasi 1.324444
## Satir 100 ortalamasi 1.720395
Soru 4. Kodlarla geometrik şekilleri oluşturma
n <- 5
for(i in 1:n) {
cat(rep("* ", n), "\n")
}
## * * * * *
## * * * * *
## * * * * *
## * * * * *
## * * * * *
n <- 5
for(i in 1:n) {
for(j in 1:n) {
if(i == 1 || i == n || j == 1 || j == n) {
cat("* ")
} else {
cat(" ")
}
}
cat("\n")
}
## * * * * *
## * *
## * *
## * *
## * * * * *
n <- 5
for (i in 1:n) {
cat(rep("*", i), "\n")
}
## *
## * *
## * * *
## * * * *
## * * * * *
n <- 5 # Yükseklik
for(i in 1:n) {
# 1. ADIM: Önce Boşlukları Bas (Soldan itmek için)
# Kural: n - i kadar boşluk
if(i < n) { # Son satırda boşluk yok, hata vermesin diye if koyduk
for(k in 1:(n - i)) {
cat(" ")
}
}
# 2. ADIM: Sonra Yıldızları Bas
# Kural: 2*i - 1 kadar yıldız (1, 3, 5, 7...)
for(j in 1:(2 * i - 1)) {
cat("*")
}
# 3. ADIM: Alt Satıra Geç
cat("\n")
}
## *
## ***
## *****
## *******
## *********
n <- 5 # Yükseklik
for(i in 1:n) {
# 1. ADIM: Hizalama Boşlukları (Soldan itmek için)
if(i < n) {
for(k in 1:(n - i)) {
cat(" ")
}
}
# 2. ADIM: Şekli Çizme (Yıldız mı Boşluk mu?)
# O satırdaki toplam karakter sayısı: 2*i - 1
genislik <- 2 * i - 1
for(j in 1:genislik) {
# Kural:
# 1. En alt satırsa (i == n) -> Hepsi Yıldız
# 2. Satırın başıysa (j == 1) -> Yıldız
# 3. Satırın sonuysa (j == genislik) -> Yıldız
if(i == n || j == 1 || j == genislik) {
cat("*")
} else {
cat(" ") # İçerisi boş
}
}
# 3. ADIM: Alt Satıra Geç
cat("\n")
}
## *
## * *
## * *
## * *
## *********
n <- 5 # Yükseklik
for(i in 1:n) {
# 1. ADIM: Boşlukları Bas (Sağa yaslamak için)
# Kural: n - i tane boşluk
if(i < n) { # Son satırda boşluk basmaya çalışıp hata vermesin
for(k in 1:(n - i)) {
cat(" ")
}
}
# 2. ADIM: Yıldızları Bas
# Kural: i tane yıldız
for(j in 1:i) {
cat("*")
}
# 3. ADIM: Alt Satıra Geç
cat("\n")
}
## *
## **
## ***
## ****
## *****
n <- 5 # Uzunluk
for(i in 1:n) {
# İç döngü: Sadece o satırın numarasına (i) kadar gitmesi yeterli
# Çünkü yıldızı koyduktan sonra sağ tarafı boş bırakabiliriz.
for(j in 1:i) {
if(i == j) {
cat("*") # Satır ve Sütun eşitse Yıldız
} else {
cat(" ") # Değilse (yıldıza gelene kadar) Boşluk
}
}
cat("\n") # Alt satıra geç
}
## *
## *
## *
## *
## *
Her zamanki gibi önce ders notlarını tekrar ettim ve özetledim.Sonra konu anlatımındaki alıştırma sorularını yapmaya çalıştım.Kullanıcılarla etkileşime giren readline() fonksiyonunu sevdim. Fonksiyonları ve for döngülerini ayrı ayrı yazmak benim için daha kolayken, ikisini birleştirince, yazılan kod satırları arttıkça birazcık işler karışıyor. Soru 3 de bir türlü sizin çıktınızla aynı sonucu elde edemedim, bir mantık ya da sıralama hatası var ama bulamadım. Geometrik şekilleri oluştumak beni zorladı yardım almak zorunda kaldım ama mantığını anlamak için elimden geleni yaptım. Sanırım içi içe döngülerine biraz daha çalışmam lazım. Daha R konusunda uzun ince bir yol var önümde…