Bu haftaki dersimizde kontrol yapıları üzerinde çalıştık. R ’da döngüler akış kontrolü mekanizmasının bir parçasıdır.
if else
kombinasyonu bir koşulu test etmemize ve
doğru/yanlış olmasına göre hareket etmemize fırsat sunar.
x <- 55
if (x >= 50) {
print("Basarılı")
} else {
print("Basarısız")
}
## [1] "Basarılı"
50 ve üstü puan alanların başarılı sayıldığı bir sınavda 55 puan alan
kişinin başarılı olduğuna yönelik if else
kodu yukardaki
gibi olabilir.
x <- 60
if(x>=80){
print("AA")
}else if(x>=70){
print("BB")
}else if(x>=60){
print("CC")
}else if(x>=50){
print("DD")
}else{
print("FF")
}
## [1] "CC"
Koşul kısmında birden fazla argüman kullancaksak else if
lerle birden fazla koşulu aşağı doğru sıralayabiliriz. 60 puan alan
kişinin notu koşul kısmında CC
notuyla karşılık
buluyor.
x <- 3
if (x == 0) {
print("1/0 tanımsızdır")
} else {
paste(x, " sayısının çarpmaya göre tersi 1/", x, sep = "")
}
## [1] "3 sayısının çarpmaya göre tersi 1/3"
Burada bir a sayısının çarpmaya göre tersini yani 1/a ’yı , 0 için ise tanımsızdır çıktısını veren bir kod oluşturduk.
# rnorm ile normal dağılımdan bir rastgele sayı üret
x <- rnorm(1, mean = 0, sd = 1)
# Üretilen sayıyı ekrana yazdır
x
## [1] 0.2666791
if (x >= 1) {
print("1'den buyuk")
} else if (x >= -1) {
print("-1 ile +1 arasında")
} else {
print("-1'den kucuk")
}
## [1] "-1 ile +1 arasında"
Burada -2 ile 2 arasında rastgeke sayılar üretip bunların -1 ve 1 e göre büyüklük durumuna göre çıktı vermesini sağlayan kod oluşturulmuştur.
x <- c(1,2,3,4)
if(all(x>0)){
print("tum sayilar 0'dan buyuktur")
} else{
print("tum sayilar 0'dan buyuk degildir")
}
## [1] "tum sayilar 0'dan buyuktur"
if
önermesiyle tek elemanlı vektörler için çıktı
alabilirken if all
önermesiyle çok elemanlı vektörler için
de koşul testi yapabiliriz.
x <- c(1,2,-3,4)
if(any(x<0)){
print("nesne en az bir negatif sayi icerir")
} else{
print("nesne negatif sayi icermez")
}
## [1] "nesne en az bir negatif sayi icerir"
Bir vektör içinde en az bir eleman için koşulun sağlanıp
sağlanmadığını if any
önermesiyle test edebiliriz.
Aşağıda 50-90 aralığından rastgele seçilen 27 tane elemanın her biri için “tek” “çift” olma durumunu veren bir kod yer almaktadır.
set.seed(41)
sayilar <- sample(50:90,27)
sayilar
## [1] 89 84 54 81 57 78 55 71 80 62 87 67 70 83 82 61 66 53 50 69 79 64 85 51 73
## [26] 74 88
ifelse(sayilar %%2 == 0, "çift sayı", "tek sayı")
## [1] "tek sayı" "çift sayı" "çift sayı" "tek sayı" "tek sayı" "çift sayı"
## [7] "tek sayı" "tek sayı" "çift sayı" "çift sayı" "tek sayı" "tek sayı"
## [13] "çift sayı" "tek sayı" "çift sayı" "tek sayı" "çift sayı" "tek sayı"
## [19] "çift sayı" "tek sayı" "tek sayı" "çift sayı" "tek sayı" "tek sayı"
## [25] "tek sayı" "çift sayı" "çift sayı"
Elimizdeki sayıların negatif, pozitif olmalarına yönelik çıktı sağlayan kod aşağıda yer almaktadır.
set.seed(987)
sayilar <- sample(-10:10,27,replace=TRUE)
sayilar
## [1] 4 3 4 2 1 7 -10 5 6 -8 7 -3 9 7 -9 10 4 -1 -8
## [20] 8 -3 0 4 5 8 1 3
ifelse ( sayilar >0 , "pozitif",
ifelse ( sayilar < 0, "nagatif", "sifir"))
## [1] "pozitif" "pozitif" "pozitif" "pozitif" "pozitif" "pozitif" "nagatif"
## [8] "pozitif" "pozitif" "nagatif" "pozitif" "nagatif" "pozitif" "pozitif"
## [15] "nagatif" "pozitif" "pozitif" "nagatif" "nagatif" "pozitif" "nagatif"
## [22] "sifir" "pozitif" "pozitif" "pozitif" "pozitif" "pozitif"
Final sınavından 50 ve üzeri alan ve en az 11 derse devam eden öğrencilerin geçme notları finalin % 60 ı ve vizenin yüzde % 40 ı alınarak hesaplansın, 11 dersten az devamı olan öğrencilerin ise geçem notları finalin %60 olarak hesaplansın istersek aşağıdaki kodu kullanabiliriz.
vize <- c(50,75,85,90,50)
final <- c(40,85,60,50,70)
devam <- c(14,10,13,12,11)
ifelse ( devam <= 11, 0.6*final,
ifelse ( final >= 50, (0.6*final)+(0.4*vize), "KALDI"))
## [1] "KALDI" "51" "70" "66" "42"
For döngülerini bir nesnenin (liste, vektör, vb.) elemanları üzerinde yineleme yapmak için kullanılırız.
for(i in 1:5) {
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
x <- c("bugun", "hava", "cok", "guzel")
for(i in 1:4) {
## 'x'in her bir öğesini yazdırır
print(x[i])
}
## [1] "bugun"
## [1] "hava"
## [1] "cok"
## [1] "guzel"
for(i in 5:10){
print("Nasılsın")
}
## [1] "Nasılsın"
## [1] "Nasılsın"
## [1] "Nasılsın"
## [1] "Nasılsın"
## [1] "Nasılsın"
## [1] "Nasılsın"
d <- data.frame(a = 1:5, b=2:6)
d
## a b
## 1 1 2
## 2 2 3
## 3 3 4
## 4 4 5
## 5 5 6
for(x in d) {
cat("sutun toplamlari:", sum(x), "\n")
}
## sutun toplamlari: 15
## sutun toplamlari: 20
X <- cbind(1:5, 21:25)
X
## [,1] [,2]
## [1,] 1 21
## [2,] 2 22
## [3,] 3 23
## [4,] 4 24
## [5,] 5 25
Burada birinci satırda yer alan elemanların çarpımı 21, ikincisinde yer alanların çarpımı 44 … yazdırmak için aşağıdaki kodu kullanabiliriz.
for (i in 1: nrow(X)){
cat (i, ".satirdaki sayilarin çarpimi", X[i,1]*X[i,2], sep= "", "\n")
}
## 1.satirdaki sayilarin çarpimi21
## 2.satirdaki sayilarin çarpimi44
## 3.satirdaki sayilarin çarpimi69
## 4.satirdaki sayilarin çarpimi96
## 5.satirdaki sayilarin çarpimi125