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

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.

Sıra Bizde

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.

if-all

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.

if-any

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.

Sıra Bizde

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

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

Sıra Bizde

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