Temel R kullanımı

Evet, dataFLOYD olarak R programlama dilini de ihmal etmek istemiyoruz. Bu yazımızla bir başlangıç verelim gerisi gelir herhalde :) Lafı uzatmadan hemen konumuza başlayalım

In [4]:
# hemen başlıyoruz koda :)
# şaka şaka resmi html içine gömmek için yapıyoruz bunu
library("IRdisplay")
display_png(file="r_basicslogo.png") 

Bilgisayarımıza nasıl R kurarız?

Başlamadan önce bilgisayarınıza ilk kez R kuracaksanız aşağıdaki yöntemleri kullanabilirsiniz.

1. Yöntem: RStudio ile R kullanımı

Öncelikle aşağıdaki bağlantıdan işletim sisteminize uygun olan R paketini indirin ve bilgisayarınıza kurulumu gerçekleştirin.

Rstudio Desktop programını indirin. "Open Source License" versiyonunu kullanın. Bilgisayarınıza kurulum yapın

RStudio programını kullanarak R alemlerine akabilirsiniz artık tebrikler!

2. Yöntem: Anaconda üzerinden kurulum yaparak Jupyter Notebook ile kullanmak

Bilgisayarınızda Anaconda yoksa ilk önce bunu kurmalısınız. Python 3.x versiyonunu tercih etmenizi tavsiye ederim.

Anaconda kurulumu sonrası "Anaconda Prompt" uygulamasını açınız ve aşağıdaki komutu yazarak R için yeni bir ortam oluşturun

conda create -n mro_env r-essentials mro-base

Komut sonrası kurulum biraz vakit alabilir sabırlı olun:)

Herşey tamamlanınca yine "Anaconda Prompt" uygulamasında oluşturduğumuz ortama geçiş yapın.

conda activate mro_env

Sonrasında yine "Anaconda Prompt"ta aşağıdaki komutu giriyoruz ve "browser"da "Jupyter" açılıyor

jupyter notebook

Burada "New" kısmına basın, R seçin ve artık hazırsınız!


Temel operasyonlar

Temel operasyonlar her dilde hemen hemen aynıdır. 4 işleme bakalım

R dilinde "comment" ekleme # ile yapılır

In [1]:
# Toplama
42 + 42
# Çıkarma
42-12
# Çarpma
2 * 2
# Bölme
12 / 5
# Üs alma
5^3
# Mod alma
13 %% 3
84
30
4
2.4
125
1

Değişken tanımlama kuralları

Değişken tanımlanırken aşağıdaki kurallara dikkat edilir

  • Değişkenlerde harf, rakam ve ., _ bulunabilir.
    • Örnek: elma, armut20, benim.degiskenim, bu_da_olur, Büyük.Harf
  • Değişkenler bir harf veya . le başlamalı. Eğer . ile başlarsa bunun ardından bir rakam gelemez
    • Örnek: .degisken, r2d2
  • Bazı reserved kelimeler değişken ismi olarak kullanılamaz
    • Örnek: TRUE, NULL, NaN değişken olarak kullanılamaz

Şimdi bu R dilinde bir değişkene değer atama (assignment) dediğimiz olay biraz değişiktir. Python gibi bir dil kullanıyorsanız genellikle değişkene değer atamak için = kullanılır biliyorsunuz.

Ama R dilinde genel kabul edilen kullanım <- şeklindedir. = operatörü de çalışır, fakat R kullanıyorsanız <- kullanın lütfen, daha havalı olur :)

In [2]:
a <- 3*3
a
9
In [3]:
# = operatörü de çalışır ama bunu kullanmayı tavsiye etmem
a = 3*3
a
9
In [4]:
a <- 3
b <- 2
c <- a +b
c
5

string

In [5]:
ilk_str <- "Merhaba dünya!"
ilk_str
'Merhaba dünya!'

logical

In [6]:
asd <- TRUE
qwe <- FALSE
asd
qwe
TRUE
FALSE

Değişkenlerin tiplerini öğrenmek

Bu amaçla class fonksiyonu kullanılır.

In [7]:
x <- 3.14
class(x)
y <- "pi"
class(y)
z <- FALSE
class(z)
'numeric'
'character'
'logical'

Vektörler

R kullanacaksanız vektörleri mutlaka bilmeniz gerekir. c() fonksiyonu kullanılarak vektör oluşturulur. Vektörler sayı olabileceği gibi başka tiplerden de oluşabilirler

In [8]:
# Nümerik
a <- c(1,2,3)
a
# string
b <- c("bir","iki","üç")
b
  1. 1
  2. 2
  3. 3
  1. 'bir'
  2. 'iki'
  3. 'üç'

Vektörlerin her bir elemanına isim verilebilir

names() fonksiyonu kullanılarak bu işlem gerçekleştirilebilir.

In [9]:
a <- c(10,20,30)
isimler <- c("Elma","Armut","Portakal")
names(a) <- isimler
a
# İsimlemdirilmiş alanlara erişim
a["Elma"]
Elma
10
Armut
20
Portakal
30
Elma: 10

Nümerik vektörler üzerinde çeşitli işlemler

İşlemler eleman bazında yapılmaktadır.

İki vektörü eleman bazında toplamak, çarpmak, çıkarmak vb..

In [10]:
a <- c(10,20,30)
b <- c(1,2,3)
a+b
a*b
a^b
  1. 11
  2. 22
  3. 33
  1. 10
  2. 40
  3. 90
  1. 10
  2. 400
  3. 27000
In [11]:
# Boyutlar tutmazsa hata (error) vermez
# kısa olan vektörü ilk elemanından başlayarak 
# diğerinin boyutuna yetişecek şekilde tamamlar
a <- c(10,20,30)
b <- c(1,2,3,4)
a+b
Warning message in a + b:
"uzun olan nesne uzunluğu kısa olan nesne uzunluğunun bir katı değil "
  1. 11
  2. 22
  3. 33
  4. 14

Bir vektörün elemanlarının toplamı ve ortalaması

Toplama için sum() ve ortalama için mean() fonksiyonları kullanılır.

In [12]:
a <- c(1,1,2,3,5,8)
sum(a)
mean(a)
20
3.33333333333333
In [ ]:
 

İki vektörü karşılaştırma

In [13]:
a <- c(1,1,2,3,5,8)
b <- c(3,3,3,0,0,0)
a<b
# a'nın b'den küçük elemanları için TRUE, 
# diğerleri için FALSE olan bir vektör döndürür
  1. TRUE
  2. TRUE
  3. TRUE
  4. FALSE
  5. FALSE
  6. FALSE

Vektörün elemanlarına erişim

R programlama dilinde indeksler 1'den başlar. İstediğimiz elemana erişmek için [] kullanılır

In [14]:
a <- c(1,2,3,4,5)
a[1]
a[5]
1
5

İndekslemeyi vektör olarak da yapabiliriz, bunun için bir vektör oluşturmamız gerekiyor. Yani bir serinin 1. ,3. ve 5. elemanına erişmek istersek bir vektör kullanmamız lazım

In [15]:
a <- c(1,2,3,4,5)
# a vektörünün 1,3,5 elemanlarına erişmek için
a[c(1,3,5)]
  1. 1
  2. 3
  3. 5

Kesit (Slice) alma

Mesela a değişkeninin 2. elemanından 4. elemanına erişmek istersek a[2:4] kullanılır

In [16]:
a <- c(1,2,3,4,5)
# a vektörünün 1,3,5 elemanlarına erişmek için
a[2:4]
  1. 2
  2. 3
  3. 4

Matrisler

Matrisler iki boyutlu vektörlerdir bildiğiniz gibi. Matris yaratmak için matrix() fonksiyonunu kullanırız.

In [17]:
# Bu fonksiyonu çağırdığınızda
# 1:9 1'den 9'a kadar bir vektör yaratır
# nrow: Bu vektörü 3 satıra böler 
matrix(1:9,nrow=3)
147
258
369
In [18]:
# Vektörün sıralamasını satır bazında yapmak istersek
# byrow=TRUE yapmamız gerekir
matrix(1:9,nrow=3,byrow=TRUE)
123
456
789
In [19]:
# Matrislerin satır ve sütunlarına isim verilebilir
a <- matrix(1:9,nrow=3,byrow=TRUE)
colnames(a) <- c("col1","col2","col3")
rownames(a) <- c("row1","row2","row3")
a
col1col2col3
row1123
row2456
row3789
In [20]:
# isimlendirme yaparsak erişim için bunu da kullanabiliriz
a["row1","col2"]
2

Satır ve sütun toplamlarının alınması

In [21]:
a <- matrix(1:9,nrow=3,byrow=TRUE)
# satır bazında toplam
rowSums(a)
# Burada kafanız karışmasın sadece vektörü yatay olarak gösterdi 

# sütun bazında toplam
colSums(a)
  1. 6
  2. 15
  3. 24
  1. 12
  2. 15
  3. 18

Bir matrise vektör/matris ekleme cbind() ve rbind()

In [22]:
a <- matrix(1:9,nrow=3,byrow=TRUE)
a
123
456
789
In [23]:
cbind(a,c(10,11,12))
1 2 3 10
4 5 6 11
7 8 9 12
In [24]:
rbind(a,c(10,11,12))
1 2 3
4 5 6
7 8 9
101112
In [25]:
# iki matrisi birbirine ekleme
b <- matrix(11:19,nrow=3,byrow=TRUE)
cbind(a,b)
1 2 3 111213
4 5 6 141516
7 8 9 171819

Matrislerden kesit alma

In [26]:
a <- matrix(1:9,nrow=3,byrow=TRUE)
a
# a matrisinden kesit
a[2:3,2:3]
123
456
789
56
89
In [27]:
# a matrisinin ilk sütunu
a[,1]
  1. 1
  2. 4
  3. 7
In [28]:
# a matrisinin ilk satırı
a[1,]
  1. 1
  2. 2
  3. 3

Faktör (Factors)

Dikkatinizi istiyorum burada, eğer kategorik bir değişken yaratmak istiyorsanız (örneğin Kadın Erkek gibi) factors() fonksiyonunu kullanılırız.

In [29]:
a <- c("K","E","E","K","K")
class(a)
b <- factor(a)
class(b)
'character'
'factor'

Peki neden yaptık bunu? Şimdi yukarıdaki örnekteki b değişkenini biraz daha inceleyelim. levels() fonksiyonunu kullanalım.

In [30]:
levels(b)
  1. 'E'
  2. 'K'

Gördüğünüz gibi iki adet seviye mevcut. İstersek bunların isimlerini de değiştirebiliriz.

In [31]:
levels(b) <- c("Kadın","Erkek")
b
  1. Erkek
  2. Kadın
  3. Kadın
  4. Erkek
  5. Erkek

Özet yapma kabiliyeti de var bu değişkenlerin. summary() kullanmamız lazım.

In [32]:
summary(b)
Kadın
2
Erkek
3

Sıralı faktör

Faktörleri sıralı halde yapabiliriz. summary() fonksiyonu ile özet yaparsak farkı anlayabiliriz.

In [33]:
hiz <- c("iki","üç","bir","bir","üç")
a <- factor(hiz,ordered=TRUE,levels=c("bir","iki","üç"))
summary(a)
bir
2
iki
1
üç
2

Sıralı olmasının bir güzelliği de karşılaştırma yapabilmemizdir. Mesela a nın ilk elemanı ile ikinci elemanını karşılaştıralım.

In [34]:
a[1] > a [2]
# yukarıda sıralı faktörü bir, iki, üç olarak 
# tanımladığımız için ve a[1] = "iki" a[2] = "üç"
# olduğu için sonuç FALSE çıkacak
FALSE

DataFrame

Geldik en önemli veri yapısı olan dataframe'e. dataframei bir "excel" tablosu olarak düşünebiliriz. Yani satırlar ve sütunlar mevcut. Her bir satır bir gözlemi her bir sütunda bir değişkeni belirtiyor.

R içerisinde gömülü olan örnek dataframe yapıları var. Bunlardan mtcars'a bakalım

In [35]:
mtcars
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX421.0 6 160.0110 3.90 2.62016.460 1 4 4
Mazda RX4 Wag21.0 6 160.0110 3.90 2.87517.020 1 4 4
Datsun 71022.8 4 108.0 93 3.85 2.32018.611 1 4 1
Hornet 4 Drive21.4 6 258.0110 3.08 3.21519.441 0 3 1
Hornet Sportabout18.7 8 360.0175 3.15 3.44017.020 0 3 2
Valiant18.1 6 225.0105 2.76 3.46020.221 0 3 1
Duster 36014.3 8 360.0245 3.21 3.57015.840 0 3 4
Merc 240D24.4 4 146.7 62 3.69 3.19020.001 0 4 2
Merc 23022.8 4 140.8 95 3.92 3.15022.901 0 4 2
Merc 28019.2 6 167.6123 3.92 3.44018.301 0 4 4
Merc 280C17.8 6 167.6123 3.92 3.44018.901 0 4 4
Merc 450SE16.4 8 275.8180 3.07 4.07017.400 0 3 3
Merc 450SL17.3 8 275.8180 3.07 3.73017.600 0 3 3
Merc 450SLC15.2 8 275.8180 3.07 3.78018.000 0 3 3
Cadillac Fleetwood10.4 8 472.0205 2.93 5.25017.980 0 3 4
Lincoln Continental10.4 8 460.0215 3.00 5.42417.820 0 3 4
Chrysler Imperial14.7 8 440.0230 3.23 5.34517.420 0 3 4
Fiat 12832.4 4 78.7 66 4.08 2.20019.471 1 4 1
Honda Civic30.4 4 75.7 52 4.93 1.61518.521 1 4 2
Toyota Corolla33.9 4 71.1 65 4.22 1.83519.901 1 4 1
Toyota Corona21.5 4 120.1 97 3.70 2.46520.011 0 3 1
Dodge Challenger15.5 8 318.0150 2.76 3.52016.870 0 3 2
AMC Javelin15.2 8 304.0150 3.15 3.43517.300 0 3 2
Camaro Z2813.3 8 350.0245 3.73 3.84015.410 0 3 4
Pontiac Firebird19.2 8 400.0175 3.08 3.84517.050 0 3 2
Fiat X1-927.3 4 79.0 66 4.08 1.93518.901 1 4 1
Porsche 914-226.0 4 120.3 91 4.43 2.14016.700 1 5 2
Lotus Europa30.4 4 95.1113 3.77 1.51316.901 1 5 2
Ford Pantera L15.8 8 351.0264 4.22 3.17014.500 1 5 4
Ferrari Dino19.7 6 145.0175 3.62 2.77015.500 1 5 6
Maserati Bora15.0 8 301.0335 3.54 3.57014.600 1 5 8
Volvo 142E21.4 4 121.0109 4.11 2.78018.601 1 4 2

Bir verinin dataframe yapısında olmasının birçok avantajı var. Bunları tek tek anlatmak yerine örneklerle gidelim

head() ve str() (structure) fonksiyonları

In [36]:
# ilk örneklerini göstermek istersek
# n kaç tane örnek gösterileceğini belirtir
head(mtcars,n=3)
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX421.0 6 160 110 3.90 2.62016.460 1 4 4
Mazda RX4 Wag21.0 6 160 110 3.90 2.87517.020 1 4 4
Datsun 71022.8 4 108 93 3.85 2.32018.611 1 4 1
In [37]:
# Değişkenler hakkında bilgi verir
str(mtcars)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

datafame nasıl oluşturulur?

Hazır veri seti kullanmak kolay diyorsunuz sanırım :) Sıfırdan bir tane yapalım isterseniz. data.frame ile hazırlıyoruz.

In [38]:
isim <- c("Ali","Ahmet","Ayşe","Ayla")
boy <- c(183,172,165,190)
cinsiyet <- c("E","E","K","K")
kilo <- c(90.1,70.4,55.3,65.8)
kisiler <- data.frame(isim,boy,cinsiyet,kilo)
kisiler
str(kisiler)
isimboycinsiyetkilo
Ali 183 E 90.1
Ahmet172 E 70.4
Ayşe 165 K 55.3
Ayla 190 K 65.8
'data.frame':	4 obs. of  4 variables:
 $ isim    : Factor w/ 4 levels "Ahmet","Ali",..: 2 1 4 3
 $ boy     : num  183 172 165 190
 $ cinsiyet: Factor w/ 2 levels "E","K": 1 1 2 2
 $ kilo    : num  90.1 70.4 55.3 65.8

Dikkat ederseniz bazı değişkenleri otomatik olarak factor haline çevrilmiştir.

dataframe yapısında matrislerde olduğu gibi kesit alma yapabiliriz

In [39]:
mtcars[1,]
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX421 6 160 110 3.9 2.62 16.460 1 4 4
In [40]:
mtcars[,1]
  1. 21
  2. 21
  3. 22.8
  4. 21.4
  5. 18.7
  6. 18.1
  7. 14.3
  8. 24.4
  9. 22.8
  10. 19.2
  11. 17.8
  12. 16.4
  13. 17.3
  14. 15.2
  15. 10.4
  16. 10.4
  17. 14.7
  18. 32.4
  19. 30.4
  20. 33.9
  21. 21.5
  22. 15.5
  23. 15.2
  24. 13.3
  25. 19.2
  26. 27.3
  27. 26
  28. 30.4
  29. 15.8
  30. 19.7
  31. 15
  32. 21.4
In [41]:
mtcars[3:5,4:6]
hpdratwt
Datsun 710 93 3.85 2.320
Hornet 4 Drive110 3.08 3.215
Hornet Sportabout175 3.15 3.440

Doğrudan sütun isimlerini de yazarak erişim veriye gerçekleştirebiliriz. İkili sütun örneği yapalım.

In [42]:
kisiler[2:3,c("kilo","boy")]
kiloboy
270.4172
355.3165

Genellikle değişkenlere (sütunlara) erişim gerçekleştirmek için $ işareti kullanılır.

In [43]:
kisiler$boy
  1. 183
  2. 172
  3. 165
  4. 190

dataframe yapılarında koşullu seçim nasıl yapılır?

Örneğin hazırladığımız "kisiler" verisetinde boyu 175 altı olanları bulalım

In [44]:
# bu bir logical seri döndürür
kisiler$boy<175

# bu seriyi satır kısmına veriyoruz sütunların hepsini alıyoruz
# kisiler[--satırlar-- ,--sütunlar--]
kisiler[kisiler$boy<175,]
  1. FALSE
  2. TRUE
  3. TRUE
  4. FALSE
isimboycinsiyetkilo
2Ahmet172 E 70.4
3Ayşe 165 K 55.3

Boyu 175 altı ve kilosu 60 üstü olanları bulalım. Burada & (ve) operatörü kullanalım.

In [45]:
kisiler[kisiler$boy<175 & kisiler$kilo>60,]
isimboycinsiyetkilo
2Ahmet172 E 70.4

Koşullu seçim yapmak için subset fonksiyonunu da kullanabiliriz.

In [46]:
subset(kisiler,boy<175)
isimboycinsiyetkilo
2Ahmet172 E 70.4
3Ayşe 165 K 55.3

order() fonksiyonu sıralama yapmak için kullanılabilir.

In [47]:
order(kisiler$boy)
  1. 3
  2. 2
  3. 1
  4. 4
In [48]:
# order() sonucunu yine satır kısmına 
# verirsek veri yapısını sıralayabiliriz.
kisiler[order(kisiler$boy),]
isimboycinsiyetkilo
3Ayşe 165 K 55.3
2Ahmet172 E 70.4
1Ali 183 E 90.1
4Ayla 190 K 65.8
In [49]:
# Büyükten küçüğe sıralamak istersek
kisiler[order(kisiler$kilo,decreasing = TRUE),]
isimboycinsiyetkilo
1Ali 183 E 90.1
2Ahmet172 E 70.4
4Ayla 190 K 65.8
3Ayşe 165 K 55.3

Lists (Listeler)

Listeler genel tanımları itibariyle içine her türlü nesneyi atabildiğimiz veri yapılarıdır. list() fonksiyonu ile oluşturulur.

In [50]:
a <- c(1,2,3,4)
b <- matrix(1:9,nrow=3)
c <- TRUE
d <- kisiler # R içine gömülü veri seti
liste <- list(a,b,c,d)
liste
    1. 1
    2. 2
    3. 3
    4. 4
  1. 147
    258
    369
  2. TRUE
  3. isimboycinsiyetkilo
    Ali 183 E 90.1
    Ahmet172 E 70.4
    Ayşe 165 K 55.3
    Ayla 190 K 65.8

Liste yapısına isim de verebiliriz.

In [51]:
names(liste) <- c("vektör","matris","logical","dataframe")
liste
$vektör
  1. 1
  2. 2
  3. 3
  4. 4
$matris
147
258
369
$logical
TRUE
$dataframe
isimboycinsiyetkilo
Ali 183 E 90.1
Ahmet172 E 70.4
Ayşe 165 K 55.3
Ayla 190 K 65.8

Listeyi hazırlarken de isim verebiliriz. Burada dikkat edin isimleri "string" olarak vermiyoruz.

In [52]:
list(vektör=a,matris=b,logical=c,dataframe=d)
$vektör
  1. 1
  2. 2
  3. 3
  4. 4
$matris
147
258
369
$logical
TRUE
$dataframe
isimboycinsiyetkilo
Ali 183 E 90.1
Ahmet172 E 70.4
Ayşe 165 K 55.3
Ayla 190 K 65.8

Listenin alt elemanlarını seçerken $ işaretini kullanabiliriz. Hatta bunu birden fazla kez yapabiliriz.

In [53]:
liste$dataframe$kilo
  1. 90.1
  2. 70.4
  3. 55.3
  4. 65.8

Listeye bir eleman daha eklemek istersek c() fonksiyonunu kullanırız.

In [54]:
liste <- c(liste,ekleme=42)
liste
$vektör
  1. 1
  2. 2
  3. 3
  4. 4
$matris
147
258
369
$logical
TRUE
$dataframe
isimboycinsiyetkilo
Ali 183 E 90.1
Ahmet172 E 70.4
Ayşe 165 K 55.3
Ayla 190 K 65.8
$ekleme
42