[TR] R Programlama Temelleri

[TR] R Programlama Temelleri

Merhaba, bu yazımızda R programlama konusunu ele alacağız. R dilinin kod yazım kurallarını anlatacağız. R projesinin ne olduğu ile ilgili bilgi edinmek, kurulumları öğrenmek için önceki yazımıza bakabilirsiniz.

İlk Program

R ile hello world yazdıran ilk program ile başlayalım.

myString <- "Hello, World!"
print ( myString)
[1] "Hello, World!"

Değişken Tanımlama

Her programlama dilinde olduğu gibi R programlama dilinde de çeşitli veri türlerinde değişken tanımlama işlemi yapılır. R programlama dilinde standart tanımlı veri türleri şunlardır:

  • numeric: Genel olarak sayılar için kullanılan veri türü. Örneğin; 10.5,  55,  787
  • integer: Tamsayılar için kullanılan veri türü. Örneğin; 1, 22, 5, 7
  • complex: Karmaşık sayılar için kullanılan veri türü. Örneğin; 9 + 3i, 5+7i, 2+i
  • character: Karakter değerleri için kullanılan veri türü, diğer adıyla string.
  • logical: TRUE ya da FALSE değerleri alan veri türü, diğer adıyla boolean.

R programlama dilinde, birçok özel veri türü, nesneler bulunmaktadır. Nesneler, yukarıda verilen standart veri türlerinden türetilmişlerdir. Bunlardan bazılarının ne işe yaradığına ve nasıl kullanıldığına bakalım.

String

R ortamında bir çift tek tırnak veya bir çift tek tek tırnak içine yazılan herhangi bir değer string olarak kabul edilir. Character değerlerinin birleşmesiyle oluşur. R ortamı içinde dahili olarak da, stringler çift tırnak içinde saklanır.

String tanımlama da, tek tırnak ile başlayan bir string tek tırnak ile bitmelidir. Bu string ifadesinin içine çift tırnak eklenebilir. Aynı şekilde, tek tırnak, çift tırnak ile başlayan ve biten bir stringe eklenebilir. Ancak, çift tırnak ile başlayan ve biten bir stringe çift tırnak ya da tek tırnak ile başlayan ve biten bir stringe tek tırnak eklenemez.

örnek

a <- 'Start and end with single quote'
print(a)

b <- "Start and end with double quotes"
print(b)

c <- "single quote ' in between double quotes"
print(c)

d <- 'Double quotes " in between single quote'
print(d)
[1] "Start and end with single quote"
[1] "Start and end with double quotes"
[1] "single quote ' in between double quote"
[1] "Double quote \" in between single quote"

String Biçimlendirme

paste() fonksiyonu

Stringleri birleştirmek için paste() fonksiyonu kullanılır. Fonsiyon, bir araya getirilmesi istenen herhangi bir sayıda string alabilir.

paste(..., sep = " ", collapse = NULL)

Fonksiyonun parametreleri:

  • : Birleştirilecek herhangi bir sayıda argümanı temsil eder.
  • sep: Bağımsız değişkenler arasındaki herhangi bir ayırıcıyı temsil eder.
  • collapse: İki string arasındaki boşluğu ortadan kaldırmak için kullanılır.

örnek

a <- "Hello"
b <- 'How'
c <- "are you? "

print(paste(a,b,c))

print(paste(a,b,c, sep = "-"))

print(paste(a,b,c, sep = "", collapse = ""))

[1] "Hello How are you? "
[1] "Hello-How-are you? "
[1] "HelloHoware you? "

format() fonksiyonu

Sayılar ve stringler, format() fonksiyonu kullanılarak belirli bir stile biçimlendirilebilir.

format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none"))

Fonksiyonun parametreleri:

  • x: vektör girişidir.
  • digits: görüntülenen toplam basamak sayısıdır.
  • nsmall:  ondalık noktanın sağındaki minimum basamak sayısıdır.
  • scientific: bilimsel gösterimi görüntülemek için DOĞRU olarak ayarlanır.
  • width: başlangıçta boşluklar doldurularak görüntülenecek minimum genişliği belirtir.
  • justify: dizenin sola, sağa veya merkeze gösterilmesidir.

örnek

# Total number of digits displayed. Last digit rounded off.
result <- format(23.123456789, digits = 9)
print(result)

# Display numbers in scientific notation.
result <- format(c(6, 13.14521), scientific = TRUE)
print(result)

# The minimum number of digits to the right of the decimal point.
result <- format(23.47, nsmall = 5)
print(result)

# Format treats everything as a string.
result <- format(6)
print(result)

# Numbers are padded with blank in the beginning for width.
result <- format(13.7, width = 6)
print(result)

# Left justify strings.
result <- format("Hello", width = 8, justify = "l")
print(result)

# Justfy string with center.
result <- format("Hello", width = 8, justify = "c")
print(result)
[1] "23.1234568"
[1] "6.000000e+00" "1.314521e+01"
[1] "23.47000"
[1] "6"
[1] "  13.7"
[1] "Hello   "
[1] " Hello  "

nchar() fonksiyonu

Bu fonksiyon, bir stringdeki boşluklar dahil olmak üzere karakter sayısını sayar. x – bir string olmak üzere:

nchar(x)

kullanılarak bu işlem gerçekleştirilebilir.

toupper()/ tolower() fonksiyonları

Bu fonksiyonlar, bir stringin karakterlerinin büyük/küçük harf durumunu değiştirir. x – üzerinde işlem yapılacak string olmak üzere:

toupper(x)
tolower(x)

fonksiyonları kullanılarak bu işlem gerçekleştirilebilir.

substring() fonksiyonu

Bu fonksiyon, bir stringin parçalarını çıkarır. x – işlem yapılacak string ifadesi, first – alınacak parçanın ilk indisi, last – alınacak parçanın son indisi olmak üzere:

substring(x,first,last)

fonksiyonları kullanılarak bu işlem gerçekleştirilebilir.

Vector

Vektörler, birden fazla elemanı tutabilen veri kümeleridir. Birden fazla elemanlı bir vektör oluşturmak için, c() fonksiyonunu kullanırız.

# Create a vector.
apple <- c('red','green',"yellow")
print(apple)

# Get the class of the vector.
print(class(apple))

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

[1] "red"    "green"  "yellow"
[1] "character"

List

Listeler, içinde vektörler, fonksiyonlar ve başka bir liste gibi birçok farklı öğe türünü içerebilen  R  nesneleridir.

# Create a list.
list1 <- list(c(2,5,3),21.3,sin)

# Print the list.
print(list1)

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

[[1]]
[1] 2 5 3

[[2]]
[1] 21.3

[[3]]
function (x)  .Primitive("sin")

Matrix

Matrisler, iki boyutlu bir dikdörtgen veri setidir. Matris fonksiyonuna bir vektör parametresi verilerek oluşturulabilir.

# Create a matrix.
M = matrix( c('a','a','b','c','b','a'), nrow = 2, ncol = 3, byrow = TRUE)
print(M)

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

     [,1] [,2] [,3]
[1,] "a"  "a"  "b" 
[2,] "c"  "b"  "a"

Array

Matrisler iki boyutla sınırlıyken, diziler herhangi bir sayıda boyutta olabilir. Array fonksiyonu, gerekli sayıda boyut oluşturan bir dim niteliği alır. Aşağıdaki örnekte, her biri 3×3 matris olan iki elemanlı bir dizi oluşturulur.

# Create an array.
a <- array(c('green','yellow'),dim = c(3,3,2))
print(a)

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

, , 1

     [,1]     [,2]     [,3]    
[1,] "green"  "yellow" "green" 
[2,] "yellow" "green"  "yellow"
[3,] "green"  "yellow" "green" 

, , 2

     [,1]     [,2]     [,3]    
[1,] "yellow" "green"  "yellow"
[2,] "green"  "yellow" "green" 
[3,] "yellow" "green"  "yellow"

Factor

Faktörler, bir vektör kullanılarak oluşturulan R nesneleridir. Vektörü, vektördeki öğelerin farklı değerleriyle birlikte etiketler olarak saklar. Etiketler, girdi vektöründe character, numeric veya boolean vb. türde olup olmadığına bakılmaksızın her zaman karakterdir. İstatistiksel modellemede faydalıdırlar.

Faktörler, factor() fonksiyonu kullanılarak oluşturulur. nlevels fonksiyonu, seviyelerin sayısını verir.

# Create a vector.
apple_colors <- c('green','green','yellow','red','red','red','green')

# Create a factor object.
factor_apple <- factor(apple_colors)

# Print the factor.
print(factor_apple)
print(nlevels(factor_apple))

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

[1] green  green  yellow red    red    red    green 
Levels: green red yellow
[1] 3

Data Frame

Data Frameler, tablo halindeki veri nesneleridir. Data Frame’de bir matrisin aksine, her sütun farklı veri türleri içerebilir. İlk sütun numeric, ikinci sütun character ve üçüncü sütun logical olabilir. Eşit uzunluktaki vektörler listesidir. data.frame() fonksiyonu kullanılarak oluşturulur.

# Create the data frame.
BMI <- 	data.frame(
   gender = c("Male", "Male","Female"), 
   height = c(152, 171.5, 165), 
   weight = c(81,93, 78),
   Age = c(42,38,26)
)
print(BMI)

Kodu çalıştırdığımızda aşağıdaki çıktıyla karşılaşırız.

  gender height weight Age
1   Male  152.0     81  42
2   Male  171.5     93  38
3 Female  165.0     78  26

Operatörler

Operatör,  belirli matematiksel veya mantıksal işlemleri yapılmasını sağlayan bir semboldür. R dili, yerleşik operatörler açısından zengindir. Operatörleri beş sınıfa ayırabiliriz:

  1. Aritmetik Operatörler
  2. İlişkisel Operatörler
  3. Mantıksal Operatörler
  4. Atama Operatörleri
  5. Diğer Operatörler

Aritmetik Operatörler

+

İki vektörü toplamak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v+t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 10.0 8.5 10.0

Birinci vektörden ikincisini çıkarmak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v-t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] -6.0 2.5 2.0

*

İki vektörü çarpmak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v*t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 16.0 16.5 24.0

/

İlk vektörü ikincisine bölmek için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v/t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 0.250000 1.833333 1.500000

%%

İlk vektörün ikincisine bölümünden kalanı bulmak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v%%t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 2.0 2.5 2.0

%/%

İlk vektörün ikincisine bölümünün tam sonucunu bulmak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v%/%t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 0 1 1

^

Üs almak için kullanılır.

v <- c( 2,5.5,6)
t <- c(8, 3, 4)
print(v^t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 256.000 166.375 1296.000

İlişkisel Operatörler

>

Büyüktür operatörü. İlk ifade ikincisinden büyükse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v>t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] FALSE TRUE FALSE FALSE

<

Küçüktür operatörü. İlk ifade ikincisinden küçükse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v < t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE FALSE TRUE FALSE

==

Eşitlik Operatörü. Verilen iki ifade eşitse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v==t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] FALSE FALSE FALSE TRUE

<=

Küçük eşittir operatörü. İlk ifade ikincisine eşit veya ikincisinden küçükse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v<=t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE FALSE TRUE TRUE

>=

Büyük eşittir operatörü. İlk ifade ikincisine eşit veya ikincisinden büyükse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v>=t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] FALSE TRUE FALSE TRUE

!=

Değil eşit Operatörü. Verilen iki ifade eşit değilse True değerini döndürür.

v <- c(2,5.5,6,9)
t <- c(8,2.5,14,9)
print(v!=t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE TRUE TRUE FALSE

Mantıksal Operatörler

&

Ve operatörü. ilk vektör ve ikinci vektörde karşılık gelen elemanların her biri için değer döndürür.

v <- c(3,1,TRUE,2+3i)
t <- c(4,1,FALSE,2+3i)
print(v&t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE TRUE FALSE TRUE

|

Veya  operatörü. ilk vektör ve ikinci vektörde karşılık gelen elemanların her biri için değer döndürür.

v <- c(3,0,TRUE,2+2i)
t <- c(4,0,FALSE,2+3i)
print(v|t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE FALSE TRUE TRUE

&&

Ve operatörü. ilk ve ikinci vektörü kıyaslar ve tek bir değer döndürür.

v <- c(3,0,TRUE,2+2i)
t <- c(1,3,TRUE,2+3i)
print(v&&t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] TRUE

||

Veya operatörü. ilk ve ikinci vektörü kıyaslar ve tek bir değer döndürür.

v <- c(0,0,TRUE,2+2i)
t <- c(0,3,TRUE,2+3i)
print(v||t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] FALSE

!

Değil operatörü. Vektörde her elmanın ters değerini döndürür.

v <- c(3,0,TRUE,2+2i)
print(!v)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] FALSE TRUE FALSE FALSE

Atama Operatörleri

=

Genel atama operatörüdür.

v3 = c(3,1,TRUE,2+3i)
print(v3)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 3+0i 1+0i 1+0i 2+3i

<-   <<-

Sola atama operatörü

v1 <- c(3,1,TRUE,2+3i)
v2 <<- c(3,1,TRUE,2+3i)
print(v1)
print(v2)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 3+0i 1+0i 1+0i 2+3i
[1] 3+0i 1+0i 1+0i 2+3i

->  ->>

Sağa atama operatörü

c(3,1,TRUE,2+3i) -> v1
c(3,1,TRUE,2+3i) ->> v2 
print(v1)
print(v2)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 3+0i 1+0i 1+0i 2+3i
[1] 3+0i 1+0i 1+0i 2+3i

Diğer Operatörler

:

Kolon Operatörü. Bir vektör için sırayla bir dizi sayı oluşturur.

v <- 2:8
print(v)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 2 3 4 5 6 7 8

%in%

Bu operatör, bir elemanın bir vektöre ait olup olmadığını belirlemek için kullanılır.

v1 <- 8
v2 <- 12
t <- 1:10
print(v1 %in% t)
print(v2 %in% t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

[1] 3+0i 1+0i 1+0i 2+3i
[1] 3+0i 1+0i 1+0i 2+3i

%*%

Bu operatör, bir matrisi devrik ile çarpmak için kullanılır.

M = matrix( c(2,6,5,1,10,4), nrow=2,ncol=3,byrow =
TRUE)
t = M %*% t(M)
print(t)

Kod çalıştırıldığında aşağıdaki çıktıyı verir.

 [,1] [,2]
[1,] 65 82
[2,] 82 117

Koşul İfadeleri

Koşul yapıları, programcının bir veya daha fazla koşul altında programın nasıl seyredeceğini belirlemesini sağlar.

İf ifadesi

Bir if ifadesi, bir veya daha fazla ifadenin izlediği bir mantıksal ifadeden oluşur.

R’de bir if ifadesi oluşturmak için temel sözdizimi şöyledir:

if(boolean_expression) {
// statement(s) will execute if the boolean expression is true.
}

Örnek

x <- c("what","is","truth")
if("Truth" %in% x){
print("Truth is found")
} else {
print("Truth is not found")
}

[1] "Truth is not found"

if ….. else ifadesi

Bir if ifadesini, mantıksal ifadesi yanlış olduğunda yürütülen isteğe bağlı bir else ifadesi izleyebilir.

R’de if…else ifadesi oluşturmak için temel sözdizimi şöyledir:

if(boolean_expression) {
// statement(s) will execute if the boolean expression is true.
} else {
// statement(s) will execute if the boolean expression is false.
}

Örnek

x <- c("what","is","truth")
if("Truth" %in% x){
print("Truth is found")
} else {
print("Truth is not found")
} 

[1] "Truth is not found"

switch ifadesi

Bir switch ifadesi, bir değişkenin bir değerler listesine göre eşitlik açısından test edilmesini sağlar. Her bir değere durum adı verilir ve açılan değişken her durum için kontrol edilir.

R’de bir switch ifadesi oluşturmak için temel sözdizimi şöyledir:

switch(expression, case1, case2, case3....)

Örnek

x <- switch(
3,
"first",
"second",
"third",
"fourth"
)
print(x)

[1] "third"

Döngüler

Bir kod bloğunu birkaç kez çalıştırmanız gerektiğinde kullanılan ifadedir.
Programlama dillerinin çoğunda bir döngü ifadesinin genel biçimi aşağıdadır:

Repeat Döngüsü

Repeat döngüsü, bir durdurma koşulu ile karşılanana kadar aynı kodu tekrar tekrar yürütür.

R’da bir repeat döngüsü oluşturmak için temel sözdizimi şöyledir:

repeat {
   commands 
   if(condition){
      break
   }
}

örnek

v <- c("Hello","loop")
cnt <- 2
repeat{
    print(v)
    cnt <- cnt+1
    if(cnt > 5){
       break
    }  
}

[1] "Hello" "loop"
[1] "Hello" "loop"
[1] "Hello" "loop"
[1] "Hello" "loop"

While Döngüsü

while döngüsü, bir durdurma koşulu sağlanana kadar aynı kodu tekrar tekrar yürütür.

R’da bir while döngüsü oluşturmak için temel sözdizimi şöyledir:

while (test_expression) {
   statement
}

örnek

v <- c("Hello","while loop")
cnt <- 2
while (cnt < 7){
   print(v)
   cnt = cnt + 1
}

[1] "Hello" "while loop"
[1] "Hello" "while loop"
[1] "Hello" "while loop"
[1] "Hello" "while loop"
[1] "Hello" "while loop"

For Döngüsü

For döngüsü, belirli sayıda yürütmesi gereken bir döngüyü verimli bir şekilde yazmanıza olanak tanıyan bir döngü kontrol yapısıdır.

R’da bir for döngüsü ifadesi oluşturmak için temel sözdizimi şöyledir:

for (value in vector) {
    statements
}

örnek

v <- LETTERS[1:4]
for ( i in v) {
   print(i)
}

[1] "A"
[1] "B"
[1] "C"
[1] "D

Döngü Kontrol İfadeleri

Döngü kontrol ifadeleri, yürütmenin normal seyrini değiştiren ifadelerdir. Bunlar break ve next deyimleridir.

Break ifadesi

R programlama dilindeki break ifadesi aşağıdaki iki kullanıma sahiptir:

  • Bir döngü içinde break ifadesi ile karşılaşıldığında, döngü hemen
    sonlandırılır ve program yürütmeye döngüyü izleyen bir sonraki ifadeden devam eder.
  •  Switch deyiminde bir durumu sonlandırmak için kullanılır.

örnek

v <- c("Hello","loop")
cnt <- 2
repeat{
   print(v)
   cnt <- cnt+1
   if(cnt > 5){
      break
   }
}

[1] "Hello" "loop"
[1] "Hello" "loop"
[1] "Hello" "loop"
[1] "Hello" "loop

Next ifadesi

R programlama dilindeki next ifadesi, bir döngünün mevcut yinelemesini sonlandırmadan sonraki yinelemeye atlamak istediğimizde kullanışlıdır. Program next ile karşılaştığında atlar ve döngünün bir sonraki yinelemesini başlatır.

örnek

v <- LETTERS[1:6]
for ( i in v){
   if (i == "D"){
      next
   }
    print(i)
}

[1] "A"
[1] "B"
[1] "C"
[1] "E"
[1] "F"

Fonksiyonlar

Fonksiyon, belirli bir görevi gerçekleştirmek için birlikte düzenlenen bir dizi ifadedir. R’in çok sayıda yerleşik fonksiyonu vardır. Bunun yanında, kullanıcı kendi fonksiyonlarını da oluşturabilir. R’da her fonksiyon bir nesnedir, bu nedenle R yorumlayıcısı, fonksiyonun eylemleri gerçekleştirmesi için gerekli olabilecek argümanlarla birlikte fonksiyonu değişkene iletebilir.
Bir R fonksiyonunun temel sözdizimi aşağıdaki gibidir:

function_name <- function(arg_1, arg_2, ...) {
   Function body 
}

örnek

Sırayla sayıların karelerini yazdırmak için bir fonksiyon oluşturalım.

new.function <- function(a) {
for(i in 1:a) {
   b <- i^2
   print(b)
   }
}

Oluşturduğumuz fonksiyonu çağıralım.

new.function(6)

Kod çalıştırıldığında aşağıdaki çıktıyı alırız.

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36

Paketler

R paketi, R fonksiyonlarının, derlenmiş kodların ve örnek verilerin olduğu bir koleksiyonudur. Paketler, R ortamında “library” adlı bir dizinin altnda saklanırlar. R kurulumu esnasında varsayılan olarak bir paket kümesi yükler. Yapılacak projenin gereksinimlerine göre ihtiyaç duyulduğunda daha fazla paket eklenebilir. Bütün R paketleri CRAN üzerinde R Packages‘de listelenmiş şekilde bulunmaktadır.

Tüm paketlerin listesini almak için library() fonksiyonunu kullanılır.

library()
Packages in library ‘C:/Program Files/R/R-3.2.2/library’:

base                    The R Base Package
boot                    Bootstrap Functions (Originally by Angelo Canty
                        for S)
class                   Functions for Classification
cluster                 "Finding Groups in Data": Cluster Analysis
                        Extended Rousseeuw et al.
codetools               Code Analysis Tools for R
compiler                The R Compiler Package
datasets                The R Datasets Package
foreign                 Read Data Stored by 'Minitab', 'S', 'SAS',
                        'SPSS', 'Stata', 'Systat', 'Weka', 'dBase', ...
graphics                The R Graphics Package
grDevices               The R Graphics Devices and Support for Colours
                        and Fonts
grid                    The Grid Graphics Package
KernSmooth              Functions for Kernel Smoothing Supporting Wand
                        & Jones (1995)
lattice                 Trellis Graphics for R
MASS                    Support Functions and Datasets for Venables and
                        Ripley's MASS
Matrix                  Sparse and Dense Matrix Classes and Methods
methods                 Formal Methods and Classes
mgcv                    Mixed GAM Computation Vehicle with GCV/AIC/REML
                        Smoothness Estimation
nlme                    Linear and Nonlinear Mixed Effects Models
nnet                    Feed-Forward Neural Networks and Multinomial
                        Log-Linear Models
parallel                Support for Parallel computation in R
rpart                   Recursive Partitioning and Regression Trees
spatial                 Functions for Kriging and Point Pattern
                        Analysis
splines                 Regression Spline Functions and Classes
stats                   The R Stats Package
stats4                  Statistical Functions using S4 Classes
survival                Survival Analysis
tcltk                   Tcl/Tk Interface
tools                   Tools for Package Development
utils                   The R Utils Package

R ortamında şu anda yüklü olan tüm paketleri görmek için search() fonksiyonu kullanılır.

search()

[1] ".GlobalEnv" "tools:rstudio" "package:stats" "package:graphics" "package:grDevices"
[6] "package:utils" "package:datasets" "package:methods" "Autoloads" "package:base"

Paket kurulumu

Yeni R paketleri eklemenin iki yolu vardır. Biri doğrudan CRAN üzerinden, diğeri manuel olarak kurulumdur.

Doğrudan CRAN’dan Kurulum

Aşağıdaki komut, paketleri doğrudan CRAN sayfasından alır ve paketi R ortamına kurar.

 install.packages("Package Name")
 
# Install the package named "XML".
 install.packages("XML")

Manuel Kurulum

Manuel kurulum, gerekli paketin zip dosyası halinde indirilip R ortamında kurulumunu kapsar. Bunun için aşağıdaki komutu çalıştırabilirsiniz.

install.packages(file_name_with_path, repos = NULL, type = "source")

# Install the package named "XML"
install.packages("E:/XML_3.98-1.3.zip", repos = NULL, type = "source")

Paketi Ekleme

Bir paket kodda kullanılmadan önce mevcut R ortamına eklenmelidir. Bunun için library() fonksiyonu kullanılır.

library("package Name", lib.loc = "path to library")

Dosya İşlemleri

R’da, R ortamının dışında depolanan dosyalardan veri okuyabiliriz. Ayrıca, işletim sistemi tarafından saklanacak ve erişilecek dosyalara veri yazabiliriz. R, csv, excel, xml vb. gibi çeşitli dosya biçimlerini okuyabilir ve yazabilir.

CSV Dosyaları

R ortamında, bir csv dosyasından veri okuyabilir ve bir csv dosyasına veri yazabiliriz. Dosya, R’ın okuyabilmesi için mevcut çalışma dizininde bulunmalıdır. Bunun yanında, kendi dizinimizi de ayarlayabilir ve oradan dosyaları okuyabiliriz.

getwd() fonksiyonunu kullanarak R mevcut çalışma dizinini kontrol edebilirsiniz. Ayrıca setwd() fonksiyonunu kullanarak yeni bir çalışma dizini ayarlayabilirsiniz.

# Get and print current working directory.
print(getwd())

# Set current working directory.
setwd("/web/com")

# Get and print current working directory.
print(getwd())

[1] "/web/com/1441086124_2016"
[1] "/web/com"

CSV Dosyasını Okuma

Mevcut çalışma dizininizde bulunan bir CSV dosyasını okumak için read.csv() fonksiyonunu kullanabiliriz. Bu fonksiyon bize bir data frame döndürür.

data <- read.csv("input.csv")
print(data)

      id,   name,    salary,   start_date,     dept
1      1    Rick     623.30    2012-01-01      IT
2      2    Dan      515.20    2013-09-23      Operations
3      3    Michelle 611.00    2014-11-15      IT
4      4    Ryan     729.00    2014-05-11      HR
5     NA    Gary     843.25    2015-03-27      Finance
6      6    Nina     578.00    2013-05-21      IT
7      7    Simon    632.80    2013-07-30      Operations
8      8    Guru     722.50    2014-06-17      Finance

CSV Dosyasına Yazma

R, data frame’den csv dosyası oluşturabilir. write.csv() fonksiyonu, csv dosyasını oluşturmak için kullanılır. Bu dosya çalışma dizininde oluşturulur.

# Create a data frame.
data <- read.csv("input.csv")
retval <- subset(data, as.Date(start_date) > as.Date("2014-01-01"))

# Write filtered data into a new file.
write.csv(retval,"output.csv")
newdata <- read.csv("output.csv")
print(newdata)

  X      id   name      salary   start_date    dept
1 3      3    Michelle  611.00   2014-11-15    IT
2 4      4    Ryan      729.00   2014-05-11    HR
3 5     NA    Gary      843.25   2015-03-27    Finance
4 8      8    Guru      722.50   2014-06-17    Finance

Excel Dosyaları

Microsoft Excel, verileri .xls veya .xlsx biçiminde depolayan en yaygın kullanılan elektronik tablo programıdır. R, bazı Excel’e özgü paketleri kullanarak bu dosyalardan doğrudan okuyabilir ve yazabilir.

“xlsx” paketini kurmak için R konsolunda aşağıdaki komutu kullanabilirsiniz. Bu paketin bağımlı olduğu bazı ek paketlerin yüklenmesini isteyebilir. Ek paketleri kurmak için gerekli paket adıyla aynı komutu izleyin.

install.packages("xlsx")

Excel Dosyasını Okuma

R ortamında veri okumak için, read.xlsx() fonksiyonu kullanılır. Sonuç, R ortamında bir data frame olarak saklanır.

# Read the first worksheet in the file input.xlsx.
data <- read.xlsx("input.xlsx", sheetIndex = 1)
print(data)

      id,   name,     salary,   start_date,   dept
1      1    Rick      623.30    2012-01-01    IT
2      2    Dan       515.20    2013-09-23    Operations
3      3    Michelle  611.00    2014-11-15    IT
4      4    Ryan      729.00    2014-05-11    HR
5     NA    Gary      843.25    2015-03-27    Finance
6      6    Nina      578.00    2013-05-21    IT
7      7    Simon     632.80    2013-07-30    Operations
8      8    Guru      722.50    2014-06-17    Finance

Excel Dosyasına Yazma

R ortamında, mevcut bir excel dosyasına yazmak için write.xlsx() fonksiyonu kullanılır . Veriler matris veya data frame biçiminde iletilir.

df

write.xlsx(df, file = "mydata.xlsx")

Bınary Dosyalar

İkili dosya, yalnızca bit ve bayt (0’lar ve 1’ler) biçiminde depolanan bilgileri içeren bir dosyadır. İçindeki baytlar, yazdırılamayan birçok başka karakter içeren karakterlere ve sembollere çevrildiği için insan tarafından okunamazlar. Herhangi bir metin düzenleyiciyi kullanarak ikili bir dosyayı okumaya çalışmak, Ø ve ð gibi karakterleri gösterecektir.

İkili dosyanın kullanılabilir olması için belirli programlar tarafından okunması gerekir. Bazen, diğer programlar tarafından oluşturulan verilerin R tarafından ikili dosya olarak işlenmesi gerekir. Ayrıca R, diğer programlarla paylaşılabilen ikili dosyalar oluşturmak için gereklidir.

R’ın ikili dosyalar oluşturmak ve okumak için writeBin() ve readBin() olmak üzere iki fonksiyonu vardır.

writeBin(object, con)
readBin(con, what, n )

Kullanılan parametreler:

  • con: ikili dosyayı okumak veya yazmak için bağlantı nesnesidir.
  • object: yazılacak ikili dosyadır.
  • what: okunacak baytları temsil eden karakterdir.
  • n: ikili dosyadan okunacak bayt sayısıdır.

İkili Dosyaya Yazma

“mtcars” data frame’ini bir csv dosyası olarak okuyup ikili dosya olarak yazalım.

# Read the "mtcars" data frame as a csv file and store only the columns 
   "cyl", "am" and "gear".
write.table(mtcars, file = "mtcars.csv",row.names = FALSE, na = "", 
   col.names = TRUE, sep = ",")

# Store 5 records from the csv file as a new data frame.
new.mtcars <- read.table("mtcars.csv",sep = ",",header = TRUE,nrows = 5)

# Create a connection object to write the binary file using mode "wb".
write.filename = file("/web/com/binmtcars.dat", "wb")

# Write the column names of the data frame to the connection object.
writeBin(colnames(new.mtcars), write.filename)

# Write the records in each of the column to the file.
writeBin(c(new.mtcars$cyl,new.mtcars$am,new.mtcars$gear), write.filename)

# Close the file for writing so that it can be read by other program.
close(write.filename)

İkili Dosyadan Okuma

Yukarıda oluşturulan ikili dosya, tüm verileri bayt olarak depolar. Bu yüzden sütun değerlerinin yanı sıra sütun adlarının da uygun değerlerini seçerek okuyalım.

# Create a connection object to read the file in binary mode using "rb".
read.filename <- file("/web/com/binmtcars.dat", "rb")

# First read the column names. n = 3 as we have 3 columns.
column.names <- readBin(read.filename, character(),  n = 3)

# Next read the column values. n = 18 as we have 3 column names and 15 values.
read.filename <- file("/web/com/binmtcars.dat", "rb")
bindata <- readBin(read.filename, integer(),  n = 18)

# Print the data.
print(bindata)

# Read the values from 4th byte to 8th byte which represents "cyl".
cyldata = bindata[4:8]
print(cyldata)

# Read the values form 9th byte to 13th byte which represents "am".
amdata = bindata[9:13]
print(amdata)

# Read the values form 9th byte to 13th byte which represents "gear".
geardata = bindata[14:18]
print(geardata)

# Combine all the read values to a dat frame.
finaldata = cbind(cyldata, amdata, geardata)
colnames(finaldata) = column.names

XML Dosyaları

XML, Genişletilebilir İşaretleme Dili anlamına gelir. HTML’ye benzer şekilde, biçimlendirme etiketleri içerir. Ancak, xml’de biçimlendirme etiketleri, dosyanın içerdiği verilerin anlamını tanımlar.

“XML” paketini kullanarak bir xml dosyasını R’de okuyabilirsiniz. Bu paket aşağıdaki komut kullanılarak kurulabilir.

install.packages("XML")

xml dosyası, xmlParse() fonksiyonu kullanılarak R tarafından okunur. R’da bir liste olarak saklanır.

örnek

# Load the package required to read XML files.
library("XML")

# Also load the other required package.
library("methods")

# Give the input file name to the function.
result <- xmlParse(file = "input.xml")

JSON Dosyaları

JSON dosyası, verileri insan tarafından okunabilir biçimde metin olarak depolar. R, rjson paketini kullanarak JSON dosyalarını okuyabilir.

R konsolunda, rjson paketini kurmak için aşağıdaki komutu kullanabilirsiniz.

install.packages("rjson")

JSON dosyası, fromJSON() fonksiyonu kullanılarak R tarafından okunur ve bir liste olarak saklanır.

örnek

# Load the package required to read JSON files.
library("rjson")

# Give the input file name to the function.
result <- fromJSON(file = "input.json")

Web Verileri

Birçok web sitesi, kullanıcılar için önemli veriler barındırır. Örneğin, Dünya Sağlık Örgütü (WHO), sağlık ve tıbbi bilgiler hakkında CSV, txt ve XML dosyaları biçiminde raporlar sağlar. R programlarını kullanarak, bu tür web sitelerinden programlı olarak belirli verileri çıkarabiliriz. Web’den veri toplamak için kullanılan R’deki bazı paketler – “RCurl”, XML” ve “stringr”. Bunlar URL’lere bağlanmak, dosyalar için gerekli bağlantıları belirlemek ve bunları indirmek için kullanılır.

URL’leri ve dosyalara olan bağlantıları işlemek için aşağıdaki paketler gereklidir. R Ortamınızda yoksa, aşağıdaki komutları kullanarak kurabilirsiniz.

install.packages("RCurl")
install.packages("XML")
install.packages("stringr")
install.packages("plyr")

Dosyaların URL’lerini toplamak için getHTMLLinks() fonksiyonunu kullanacağız. Ardından dosyaları yerel sisteme kaydetmek için download.file() fonksiyonunu kullanacağız. Birden fazla dosya için aynı kodu tekrar tekrar uygulayacağımız için birden çok kez çağrılacak bir fonksiyon oluşturacağız. Dosya adları, bu fonksiyona bir R listesi nesnesi biçiminde parametreler olarak iletilir.

örnek

# Read the URL.
url <- "http://www.geos.ed.ac.uk/~weather/jcmb_ws/"

# Gather the html links present in the webpage.
links <- getHTMLLinks(url)

# Identify only the links which point to the JCMB 2015 files. 
filenames <- links[str_detect(links, "JCMB_2015")]

# Store the file names as a list.
filenames_list <- as.list(filenames)

# Create a function to download the files by passing the URL and filename list.
downloadcsv <- function (mainurl,filename) {
   filedetails <- str_c(mainurl,filename)
   download.file(filedetails,filename)
}

# Now apply the l_ply function and save the files into the current R working directory.
l_ply(filenames,downloadcsv,mainurl = "http://www.geos.ed.ac.uk/~weather/jcmb_ws/")

Veri Tabanları

Veriler, ilişkisel veritabanı sistemlerinde normalleştirilmiş bir biçimde saklanır. R, MySql, Oracle, Sql server vb. gibi birçok ilişkisel veritabanına kolayca bağlanabilir ve onlardan data freame olarak kayıtları alabilir. Veriler R ortamına çekildiğinde, normal bir R veri seti haline gelir, paketler ve fonksiyonlar kullanılarak analiz edilebilir.

Bu kısımda, R’a bağlanmak için referans veritabanı olarak MySql’i kullanacağız.

R, MySql veritabanı ile bağlantı sağlayan “RMySQL” adlı bir pakete sahiptir. Bu paketi aşağıdaki komutu kullanarak R ortamına kurabilirsiniz.

install.packages("RMySQL")

MySql’e Bağlanma

Paket yüklendikten sonra, veritabanına bağlanmak için R’da bir bağlantı nesnesi oluşturuyoruz. Parametre olarak kullanıcı adı, şifre, veritabanı adı ve ana bilgisayar adını veriyouz.

# Create a connection Object to MySQL database.
# We will connect to the sampel database named "sakila" that comes with MySql installation.
mysqlconnection = dbConnect(MySQL(), user = 'root', password = '', dbname = 'sakila',
   host = 'localhost')

# List the tables available in this database.
 dbListTables(mysqlconnection)
 [1] "actor"                      "actor_info"                
 [3] "address"                    "category"                  
 [5] "city"                       "country"                   
 [7] "customer"                   "customer_list"             
 [9] "film"                       "film_actor"                
[11] "film_category"              "film_list"                 
[13] "film_text"                  "inventory"                 
[15] "language"                   "nicer_but_slower_film_list"
[17] "payment"                    "rental"                    
[19] "sales_by_film_category"     "sales_by_store"            
[21] "staff"                      "staff_list"                
[23] "store"

SQL sorgusu gönderme

MySql’deki veritabanı tablolarını dbSendQuery() fonksiyonunu kullanarak sorgulayabiliriz. Sorgu MySql’de yürütülür ve sonuç kümesi fetch() fonksiyonu kullanılarak döndürülür. Son olarak, R’da bir data frame olarak saklanır.

# Query the "actor" tables to get all the rows.
result = dbSendQuery(mysqlconnection, "select * from actor")

# Store the result in a R data frame object. n = 5 is used to fetch first 5 rows.
data.frame = fetch(result, n = 5)
print(data.fame)
        actor_id   first_name    last_name         last_update
1        1         PENELOPE      GUINESS           2006-02-15 04:34:33
2        2         NICK          WAHLBERG          2006-02-15 04:34:33
3        3         ED            CHASE             2006-02-15 04:34:33
4        4         JENNIFER      DAVIS             2006-02-15 04:34:33
5        5         JOHNNY        LOLLOBRIGIDA      2006-02-15 04:34:33

Veri Biçimlendirme

R’da veri biçimlendirme, verileri satır-sütunlar halinde düzenleme, şeklini değiştirmekle ilgilidir. Bu işlemler genelde data frame üzerinde yapılır. Bir data frame’in satırlarından ve sütunlarından veri çekmek oldukça kolaydır.

R’ın bir data frame’deki satırları sütunlara bölmek, birleştirmek ve değiştirmek için birçok fonksiyonu vardır.

Data Frame’de Satırları ve Sütunları Birleştirme

cbind() fonksiyonunu kullanarak bir data frame oluşturmak için birden çok vektörü birleştirebiliriz. Ayrıca, rbind() fonksiyonunu kullanarak iki data frame’i birleştirebiliriz.

# Create vector objects.
city <- c("Tampa","Seattle","Hartford","Denver")
state <- c("FL","WA","CT","CO")
zipcode <- c(33602,98104,06161,80294)

# Combine above three vectors into one data frame.
addresses <- cbind(city,state,zipcode)

# Print a header.
cat("# # # # The First data frame\n") 

# Print the data frame.
print(addresses)

# Create another data frame with similar columns
new.address <- data.frame(
   city = c("Lowry","Charlotte"),
   state = c("CO","FL"),
   zipcode = c("80230","33949"),
   stringsAsFactors = FALSE
)

# Print a header.
cat("# # # The Second data frame\n") 

# Print the data frame.
print(new.address)

# Combine rows form both the data frames.
all.addresses <- rbind(addresses,new.address)

# Print a header.
cat("# # # The combined data frame\n") 

# Print the result.
print(all.addresses)

Yukarıdaki kodu çalıştırdığımızda, aşağıdaki sonucu verir.

# # # # The First data frame
     city       state zipcode
[1,] "Tampa"    "FL"  "33602"
[2,] "Seattle"  "WA"  "98104"
[3,] "Hartford" "CT"   "6161" 
[4,] "Denver"   "CO"  "80294"

# # # The Second data frame
       city       state   zipcode
1      Lowry      CO      80230
2      Charlotte  FL      33949

# # # The combined data frame
       city      state zipcode
1      Tampa     FL    33602
2      Seattle   WA    98104
3      Hartford  CT     6161
4      Denver    CO    80294
5      Lowry     CO    80230
6     Charlotte  FL    33949

Data Frameleri Birleştirme

merge() fonksiyonunu kullanarak iki data frame’i birleştirebiliriz. Birleştirmenin gerçekleştiği data framelerin sütun adları aynı olmalıdır.

Aşağıdaki örnekte, “MASS” kitaplığında bulunan Pima veri kümelerini ele alıyoruz.

library(MASS)
merged.Pima <- merge(x = Pima.te, y = Pima.tr,
   by.x = c("bp", "bmi"),
   by.y = c("bp", "bmi")
)
print(merged.Pima)
nrow(merged.Pima)

Yukarıdaki kodu çalıştırdığımızda, aşağıdaki sonucu verir.

   bp  bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y
1  60 33.8       1   117     23 0.466    27     No       2   125     20 0.088
2  64 29.7       2    75     24 0.370    33     No       2   100     23 0.368
3  64 31.2       5   189     33 0.583    29    Yes       3   158     13 0.295
4  64 33.2       4   117     27 0.230    24     No       1    96     27 0.289
5  66 38.1       3   115     39 0.150    28     No       1   114     36 0.289
6  68 38.5       2   100     25 0.324    26     No       7   129     49 0.439
7  70 27.4       1   116     28 0.204    21     No       0   124     20 0.254
8  70 33.1       4    91     32 0.446    22     No       9   123     44 0.374
9  70 35.4       9   124     33 0.282    34     No       6   134     23 0.542
10 72 25.6       1   157     21 0.123    24     No       4    99     17 0.294
11 72 37.7       5    95     33 0.370    27     No       6   103     32 0.324
12 74 25.9       9   134     33 0.460    81     No       8   126     38 0.162
13 74 25.9       1    95     21 0.673    36     No       8   126     38 0.162
14 78 27.6       5    88     30 0.258    37     No       6   125     31 0.565
15 78 27.6      10   122     31 0.512    45     No       6   125     31 0.565
16 78 39.4       2   112     50 0.175    24     No       4   112     40 0.236
17 88 34.5       1   117     24 0.403    40    Yes       4   127     11 0.598
   age.y type.y
1     31     No
2     21     No
3     24     No
4     21     No
5     21     No
6     43    Yes
7     36    Yes
8     40     No
9     29    Yes
10    28     No
11    55     No
12    39     No
13    39     No
14    49    Yes
15    49    Yes
16    38     No
17    28     No
[1] 17

Melting ve Casting

R programlamanın en ilginç yönlerinden biri, istenen veri şeklini elde etmek için verilerin şeklini birden fazla adımda değiştirmekle ilgilidir. Bunu yapmak için kullanılan fonksiyonlar melt() ve cast()’dir. Bunun için “MASS” adlı kütüphanede bulunan ships adlı veri setini ele alıyoruz.

library(MASS)
print(ships)

Yukarıdaki kodu çalıştırdığımızda, aşağıdaki sonucu verir.

     type year   period   service   incidents
1     A   60     60        127         0
2     A   60     75         63         0
3     A   65     60       1095         3
4     A   65     75       1095         4
5     A   70     60       1512         6
.............
.............
8     A   75     75       2244         11
9     B   60     60      44882         39
10    B   60     75      17176         29
11    B   65     60      28609         58
............
............
17    C   60     60      1179          1
18    C   60     75       552          1
19    C   65     60       781          0
............
............

Şimdi verileri düzenlemek için melt ediyoruz, tür ve yıl dışındaki tüm sütunları birden çok satıra dönüştürüyoruz.

molten.ships <- melt(ships, id = c("type","year"))
print(molten.ships)

Yukarıdaki kodu çalıştırdığımızda, aşağıdaki sonucu verir.

      type year  variable  value
1      A   60    period      60
2      A   60    period      75
3      A   65    period      60
4      A   65    period      75
............
............
9      B   60    period      60
10     B   60    period      75
11     B   65    period      60
12     B   65    period      75
13     B   70    period      60
...........
...........
41     A   60    service    127
42     A   60    service     63
43     A   65    service   1095
...........
...........
70     D   70    service   1208
71     D   75    service      0
72     D   75    service   2051
73     E   60    service     45
74     E   60    service      0
75     E   65    service    789
...........
...........
101    C   70    incidents    6
102    C   70    incidents    2
103    C   75    incidents    0
104    C   75    incidents    1
105    D   60    incidents    0
106    D   60    incidents    0
...........
...........

Melt edilmiş verileri, her yıl için her gemi tipinin toplamının oluşturulduğu yeni bir forma dönüştürebilir, cast edebiliriz.

recasted.ship <- cast(molten.ships, type+year~variable,sum)
print(recasted.ship)

Yukarıdaki kodu çalıştırdığımızda, aşağıdaki sonucu verir.

    type year  period  service  incidents
1     A   60    135       190      0
2     A   65    135      2190      7
3     A   70    135      4865     24
4     A   75    135      2244     11
5     B   60    135     62058     68
6     B   65    135     48979    111
7     B   70    135     20163     56
8     B   75    135      7117     18
9     C   60    135      1731      2
10    C   65    135      1457      1
11    C   70    135      2731      8
12    C   75    135       274      1
13    D   60    135       356      0
14    D   65    135       480      0
15    D   70    135      1557     13
16    D   75    135      2051      4
17    E   60    135        45      0
18    E   65    135      1226     14
19    E   70    135      3318     17
20    E   75    135       542      1