R Codes

# Üç niteliğe sahip bir data frame oluşturalım.
# birimlerin aynı şekilde tekrar üretilebilir olması için set.seed() fonksiyonunu kullanacağız.
# seq() fonksiyonu aralık oluşturmamızı sağlayacak, by: aralık artış sayısı
# sample() fonksiyonu tesadüfi birimler seçmemizi sağlayacak (iadeli ya da iadesiz oluşturabiliriz)
# LETTERS alfabeden büyük harfli birimler üretir.

set.seed(123)
mydata <- data.frame(x1 = seq(1, 20, by=2),
                        x2 = sample(100:200, 10, FALSE),
                        x3 = LETTERS[1:10])

mydata
##    x1  x2 x3
## 1   1 130  A
## 2   3 178  B
## 3   5 150  C
## 4   7 113  D
## 5   9 166  E
## 6  11 141  F
## 7  13 149  G
## 8  15 142  H
## 9  17 197  I
## 10 19 124  J

ifelse – Koşullu seçim

ifelse(test_expression, x, y)

Test sonucu TRUE ya da FALSE olmasına göre yes ya da no seçimi yapmayı sağlar.

# x4 isimli yeni bir nitelik oluşturmakl istiyorum. 
# Eğer x2, 150'de büyük ise x4 niteliği 1 olarak kodlananacak diğer durum için 0

mydata$x4 <- ifelse(mydata$x2 > 150, 1,0)
mydata
##    x1  x2 x3 x4
## 1   1 130  A  0
## 2   3 178  B  1
## 3   5 150  C  0
## 4   7 113  D  0
## 5   9 166  E  1
## 6  11 141  F  0
## 7  13 149  G  0
## 8  15 142  H  0
## 9  17 197  I  1
## 10 19 124  J  0

Şimdi de x5 değişkeni üretelim. Eğer x3 A ya da D ise yeni nitelik x1’in 2 katı, x3 niteliği B ya da C ise yeni nitelik x1’in 3 katı, diğer durumlarda da x1’in 4 katı olsun.

mydata$x5 <- ifelse(mydata$x3 %in% c("A","D"),
                    mydata$x1*2, 
                       ifelse(mydata$x3 %in% c("B","C"),
                              mydata$x1*3, 
                              mydata$x1*4))
mydata
##    x1  x2 x3 x4 x5
## 1   1 130  A  0  2
## 2   3 178  B  1  9
## 3   5 150  C  0 15
## 4   7 113  D  0 14
## 5   9 166  E  1 36
## 6  11 141  F  0 44
## 7  13 149  G  0 52
## 8  15 142  H  0 60
## 9  17 197  I  1 68
## 10 19 124  J  0 76

with()

with(), argüman olarak iletilecek işlev içindeki bir R ifadesini değerlendirmemizi sağlar. Yalnızca data framelerde çalışır.

mydata$y <- with(mydata, ifelse(x3 %in% c("A","B"), x1*2, x1*3))
mydata
##    x1  x2 x3 x4 x5  y
## 1   1 130  A  0  2  2
## 2   3 178  B  1  9  6
## 3   5 150  C  0 15 15
## 4   7 113  D  0 14 21
## 5   9 166  E  1 36 27
## 6  11 141  F  0 44 33
## 7  13 149  G  0 52 39
## 8  15 142  H  0 60 45
## 9  17 197  I  1 68 51
## 10 19 124  J  0 76 57

else if

elseif

k <- 1000
if(k>100) {
  print("this value greater than 100!")
} else if (k<100) {
  print("this value less than 100!")
} else {
  print("this value equal 100!")
}
## [1] "this value greater than 100!"
FB <- 6
GS <- 0

if(FB > GS) {
  print("FB won!")
}
## [1] "FB won!"
FB <- 5
GS <- 3

if (FB > GS) {
  print("FB won!")
} else {
  print("GS won!")
}
## [1] "FB won!"
FB <- 2
GS <- 2

if (FB>GS) {
  print("FB won!") 
} else if (FB<GS) {
  print("GS won!")
} else {
  print("draw!")
}
## [1] "draw!"

for

Döngüler, belirli bir koşula ulaşıldığı sürece bir kod bloğunu çalıştırabilir.

Bir dizi üzerinde yineleme yapmak için bir for döngüsü kullanılır

for (x in 1:10) {
  print(x)
} 
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
# 10 defa x'i yazdıracağım demek 

list

R’deki bir liste, içinde birçok farklı veri türü içerebilir. Liste, sıralı ve değiştirilebilir bir veri topluluğudur.

meyveler <- list("muz", "elma", "kiraz")

for (x in meyveler) {
  print(x)
} 
## [1] "muz"
## [1] "elma"
## [1] "kiraz"

break

break ile, tüm öğeler arasında döngü oluşturmadan önce döngüyü durdurabiliriz

meyveler <- list("muz", "elma", "kiraz")

for (x in meyveler) {
  if (x == "kiraz") {
    break
  }
  print(x)
} 
## [1] "muz"
## [1] "elma"
zar <- c(1, 2, 3, 4, 5, 6)

for (x in zar) {
  print(x)
} 
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
takimlar <- c("FB","GS")
for (takim in takimlar) {
  print(takim)
}
## [1] "FB"
## [1] "GS"
matches <- list(c(2,1), c(5,2),c(6,3))
numberofgoals <- c()
for(match in matches) {
  numberofgoals <- c(numberofgoals, sum(match))
  print(numberofgoals)
}
## [1] 3
## [1] 3 7
## [1] 3 7 9
matches <- list(c(2,1), c(5,2),c(6,3))
numberofgoals <- c()
for(match in matches) {
  numberofgoals <- c(numberofgoals, sum(match))
    if (sum(match) == 9) 
    break
  print(numberofgoals)
}
## [1] 3
## [1] 3 7

while

Döngüler zamandan tasarruf ettikleri, hataları azalttığı ve kodu daha okunaklı hale getirdikleri için kullanışlıdır.

while döngüsü ile bir koşul TRUE olduğu sürece bir dizi ifadeyi çalıştırabiliriz

# i, 6'dan küçük olduğu müddetçe i'yi yazdır
i <- 1
while(i<6) {
  print(i)
  i = i+1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

break ile while koşulu TRUE olsa bile döngüyü durdurabiliriz

i 4’e eşitse döngüden çık.

i <- 1
while (i < 6) {
  print(i)
  i <- i + 1
  if (i == 4) {
    break
  }
} 
## [1] 1
## [1] 2
## [1] 3
winner <- 0
while(winner < 9) {
  print("eliminated!")
  winner = winner + 1
}
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"
## [1] "eliminated!"

Fonksiyon oluşturma

func_name <- function (argument) {statement}

powers <- function(x, y) {
# x üzeri y fonksiyonuer y
result <- x^y
print(paste(x,"uzeri", y, result, "dir"))
}

powers(8, 2)
## [1] "8 uzeri 2 64 dir"
powers(2, 8)
## [1] "2 uzeri 8 256 dir"
newfunction <- function(a) {
  for(i in 1:a) {
    b <- i^2
    print(b)
  }
}

newfunction(5)
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25

Kayıp veri

dataset <- read.csv("Dataset.csv")
print(dataset)
##    Country Age Salary Purchased
## 1   France  44  72000       No 
## 2    Spain  27  48000       Yes
## 3  Germany  30  54000       No 
## 4    Spain  38  61000       No 
## 5  Germany  40     NA       Yes
## 6   France  35  58000       Yes
## 7    Spain  NA  52000       No 
## 8   France  48  79000       Yes
## 9  Germany  50  83000       No 
## 10  France  37  67000       Yes
# kaç tane kayıp veri var
sum(is.na(dataset))
## [1] 2
# aşağıdaki kodu kullanarak tüm NA satırlarını veri kümesinden kaldırabiliriz.
newdata <- na.omit(dataset) 

# ya da;
newdata2 <- complete.cases(dataset)
sum(is.na(newdata2))
## [1] 0

Kayıp veri yerine serinin ortalamasını atamak için

dataset$Age <- ifelse(is.na(dataset$Age),
                      ave(dataset$Age,
                          FUN = function(x)
                            mean(x, na.rm = TRUE)),
                      dataset$Age)


print(dataset)
##    Country      Age Salary Purchased
## 1   France 44.00000  72000       No 
## 2    Spain 27.00000  48000       Yes
## 3  Germany 30.00000  54000       No 
## 4    Spain 38.00000  61000       No 
## 5  Germany 40.00000     NA       Yes
## 6   France 35.00000  58000       Yes
## 7    Spain 38.77778  52000       No 
## 8   France 48.00000  79000       Yes
## 9  Germany 50.00000  83000       No 
## 10  France 37.00000  67000       Yes

Aykırı değerler

#install.packages("outliers")
library(outliers)
age <- c(18, 30, 50, 40, 25, 19, 25, 62, 34, 22)
outlier_tf <-  outlier(age,logical=TRUE)
sum(outlier_tf)
## [1] 1
# aykırı değerleri bulmak için
find_outlier <-  which(outlier_tf==TRUE,arr.ind=TRUE)

# aykırı değerleri kaldırmak için
newdata <-  dataset[-find_outlier,]
nrow(newdata)
## [1] 9

Frekanslardan gruplar oluşturmak

# 18-65 arası tesadüfi olarak 30 birim üretelim
set.seed(1)
age <- sample(18:65, 30, replace = TRUE)
age
##  [1] 21 56 18 51 40 60 31 35 50 38 38 59 63 27 24 26 32 38 54 58 42 63 54 54 51
## [26] 59 42 61 32 50
# serinin minimum ve maksimum değerlerini öğrenmek için
range(age)
## [1] 18 63
# onar artacak şekilde aralıkları tanımlayalım
inter <- seq(18, 70, by=10)
inter
## [1] 18 28 38 48 58 68
# aralıklar sağdan açık olacak şekilde (ya da sol) tanımlanmak için cut() 
cutting <- cut(age, inter, right = FALSE)
cutting
##  [1] [18,28) [48,58) [18,28) [48,58) [38,48) [58,68) [28,38) [28,38) [48,58)
## [10] [38,48) [38,48) [58,68) [58,68) [18,28) [18,28) [18,28) [28,38) [38,48)
## [19] [48,58) [58,68) [38,48) [58,68) [48,58) [48,58) [48,58) [58,68) [38,48)
## [28] [58,68) [28,38) [48,58)
## Levels: [18,28) [28,38) [38,48) [48,58) [58,68)
# tablo olarak görmek için
frequency <- table(cutting)
frequency
## cutting
## [18,28) [28,38) [38,48) [48,58) [58,68) 
##       5       4       6       8       7