Tag Archives: R giris

Listeler

Bir onceki yazida vektorlerin tek bir temel obje tipinden olustugunu soylemistik. Listeler bu acidan vektorlerden farklidir ve birden fazla obje tipini icerebilir.

Ilk olarak bir liste olusturalim:

> mylist=list(1,2,TRUE,'a')
> mylist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

[[4]]
[1] "a"

Gordugunuz gibi bu sefer vektorlerde karsilastigimiz tur donusturme davranisi ile karsilastirmadik ve her eleman onceki seklinde kaldi. Simdi listemizin 1. elemanina ulasalim:

> mylist[1]
[[1]]
[1] 1

Ama su anda hala 1. elemana ulasmadik, cunku listelerde her eleman bir tutucu olup her eleman icindeki degere ulasmak istiyorsak cift koseli parantez kullanmamiz gerekir. Farki daha iyi anlatabilmek adina:

> mylist[1]*5
Error in mylist[1] * 5 : non-numeric argument to binary operator
> class(mylist[1])
[1] "list"
> mylist[[1]]
[1] 1
> mylist[[1]]*5
[1] 5

Ilk olarak listemin birinci elemanina tek koseli parantez ile ulasabilecegimi varsayip 5 ile carpmaya calistim. Ancak hata aldim. class() fonksiyonunu kullanip gordum ki, tek koseli parantez kullandigimda elde ettigim hala bir liste. Listenin elemaninin icinde depolanan bilgiye erismek icinse iki tane koseli parantez kullandim ve bu durumda 5 ile carpabildim.

Diger ilk asamada cok bariz olmayan kimi ozelliklere bakalim. Ornegin, listemizin 4.elemanindan kurtulmak isteyelim:

> mylist[-4]
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

Ya da

> mylist[1:3]
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

Ancak farkettiginiz uzere 4.elemandan kurtulduktan sonra da hala liste elde ediyoruz. Ayni seyi cift koseli parantez kullanip bir vektor elde etmeye calisalim:

> mylist[[1:3]]
Error in mylist[[1:3]] : recursive indexing failed at level 2

Ise yaramadi. Peki bu ne demek, listeden asla vektor olusturamaz miyiz, hep liste olarak mi kalacak? Hayir bunun icin as.vector() fonksiyonunu kullanabiliriz.

> as.vector(mylist, mode='numeric')
[1] 1 2 1 NA
Warning message:
In as.vector(mylist, mode = "numeric") : NAs introduced by coercion
> as.vector(mylist, mode='character')
[1] "1" "2" "TRUE" "a"

Bu fonksiyonellikler olsa da cok kullanilmadigini soyleyebilirim. Her veri turunun kendine ozgu avantaj ve dezavantajlari var ve her tur veriyi icin belli veri tipleri daha uygun olacaktir. Genelde donusturmeler kimi fonksiyonlar sadece vektor, sadece liste tipinde objelerde calisiyorsa gerekli olabilir ancak onun disinda donusturmelerin cok kullanilmamasi daha iyi olur. Bunun bir sebebi de listelerin elemanlari tek elemandan olusmak zorunda degil. Su ornege bakalim:

> mylist2
[[1]]
[1] 0

[[2]]
[1] 1 2

[[3]]
[1] TRUE

[[4]]
[1] "a"

Bu ornekte, listemizin ikinci elemaninda iki elemanli bir vektor sakladik. Simdi az onceki yontemi kullanmaya kalkarsak:

> as.vector(mylist2, mode='numeric')
Error in as.vector(mylist2, mode = "numeric") : 
     (list) object cannot be coerced to type 'double'
> as.vector(mylist2, mode='character')
[1] "0" "c(1, 2)" "TRUE" "a"

Ikisi de bekledigimiz gibi bir sonuc degil, degil mi? Eger ki elde etmek istedigimiz vektor suna es degerse: c(“0″,”1″,”2″,”T”,”a”), unlist() fonksiyonunu kullanabiliriz. unlist() genellikle vektor yaratir:

> unlist(mylist2)
[1] "0" "1" "2" "TRUE" "a"

Simdi bir de vektorler uzerinde yaptigimiz islemler listeler uzerinde de gecerli mi ona kisaca goz atalim. Ilk olarak eslenik olarak degerlendirebilecegimiz bir vektor objesi (myvec) ve liste objesi (mylist) yaratalim:

> myvec=1:3
> myvec
[1] 1 2 3
> mylist=list(1,2,3)
> mylist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

Vektorler konusunda gordugumuz kimi islemlerin uzerinden gecip, listeler uzerinde de gecerli mi simdi ona bakalim. Ilk olarak birlestirme islemi:

> c(myvec,myvec)
[1] 1 2 3 1 2 3
> c(mylist,mylist)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 3

Yani evet listeleri de birlestirebiliyoruz! Peki aritmetik islemler?

> myvec * 3
[1] 3 6 9
> mylist * 3
Error in mylist * 3 : non-numeric argument to binary operator

Hayir, aritmetik islemleri yapabilmek icin listenin elemanlarina tek tek erismemiz gerekiyor.

Bir de isimlendirme islemlerine bakalim.

> names(myvec)=c('a','b','c')
> myvec
a b c 
1 2 3 
> names(mylist)=c('a','b','c')
> mylist
$a
[1] 1

$b
[1] 2

$c
[1] 3

Evet, isimlendirme de calisiyor. Peki isimli listede altkume alma islemleri nasil oluyor?

> myvec['a']
a 
1 
> mylist['a']
$a
[1] 1

> mylist[['a']]
[1] 1

Ayni indismis gibi isimleri kullanarak da liste elemanlarina ulasabiliyoruz. Ancak listelerde baska bir operator daha var bunun icin kullanabilecegimiz: $

> mylist$a
[1] 1

Ve bu operator cift koseli paranteze denk isliyor, gordugunuz gibi liste tipinde bir obje degil, direkt olarak ilk eleman icine kaydedilen bilgiye ulastik. Peki bu vektorlerde ise yaramiyor mu?

> myvec$a
Error in myvec$a : $ operator is invalid for atomic vectors

Hayir!


Yararli bulduysaniz lutfen ilgili ortamlarda paylasarak daha fazla kisiye ulasmasina yardimci olabilirsiniz. Ve hatta yorum / oneri / elestirileriniz icin asagiya yorum birakabilir, icerigin daha iyi olmasini saglayabilirsiniz! Paylasimlardan haberdar olmak icin blog’u takip etmeyi unutmayin!

Advertisements

Vektorler

R kimi veri yapilari uzerinde islem yapar. En basit veri yapilarindan biri olan vektorler, ayni temel obje turunden ogeleri iceren dizilerdir.

> x = c(1,2,3)
> x
[1] 1 2 3

Burada ‘x’; 1, 2, ve 3 ogelerine sahip bir vektordur. Vektor olusturmak icin bu ornekte c() fonksiyonunu kullandik. ‘c’yi, ‘concatenate’ (baglamak) ya da ‘combine’ (birlestirmek) kelimelerinden birinin kisaltilmis hali olarak aklinizda tutabilirsiniz.

Onceki ornekte numerik tipte ogelerden olusan bir vektor yarattik. Ancak vektorler hepsi ayni oldugu surece diger tiplerden de olusabilir.

> x = c(T,F,F) # logical
> x
[1]  TRUE FALSE FALSE
> x = c('x','y','aa','oiasjfioasjf') # character
> x
[1] "x"            "y"            "aa"           "oiasjfioasjf"
> x = c(1+4i,5+2i) # complex
> x
[1] 1+4i 5+2i
> x = c(1L,5L) #integer
> x
[1] 1 5

Simdi de ayni tipte olmayan tiplerle vektor olusturmaya calistigimizda ne oluyor, bunu gorelim. Ilk deneme olarak butun tipleri girdi olarak verip bir vektor yaratmaya calisalim.

> x = c(1.5, 'karakter', 3i+2, TRUE, F)

Bu ornekte; numerik, karakter, kompleks ve boolean tipinde ogeler ile bir vektor yaratmak istedik. Ve hata almadik. Peki ‘x’ objesinin modu ne ve nasil bir vektor elde ettik?

> x
[1] "1.5" "karakter" "2+3i" "TRUE" "FALSE"

Gordugunuz gibi, hata almadik ama vektor olusturma sirasinda ogeler kendi modlarini koruyamadilar. Data tipleri arasinda bir hiyerarsi vardir ve R farkli tipte ogeleri birlestirirken bu objelerden hiyerarside en yuksek olani secerek vektor yaratir. Buradan yapacagimiz cikarim, karakter tipi hiyerarside en yuksek olan. Simdi sirasiyla en yuksekte olani cikartarak, hiyerarsiyi cozmeye calisalim.

# karakteri cikarttigimizda
> x = c(1.5, 3i+2, TRUE, F)
> mode(x)
[1] "complex"
> x 
[1] 1.5+0i 2.0+3i 1.0+0i 0.0+0i
# kompleksi cikarttigimizda
> x = c(1.5, TRUE, F)
> mode(x)
[1] "numeric"
> x
[1] 1.5 1.0 0.0
# numerigi cikarttigimizda
> x = c(TRUE, F)
> mode(x)
[1] "logical"
> x
[1] TRUE FALSE

Bu durumda boolean < numerik < compleks < karakter cikarimini yapabiliriz.

Vektorlerle islemler

Vektorleri birlestirmek

Vektor yaratmak icin kullandigimiz c() fonksiyonu, ayni zamanda vektorleri birlestirmek icin de kullanilabilir.

> x = c(1,2,3)
> x
[1] 1 2 3
> y = c(4,5,6)
> y
[1] 4 5 6
> z = c(x,y)
> z
[1] 1 2 3 4 5 6
> a = c(z,9,8)
> a
[1] 1 2 3 4 5 6 9 8

Ve onceden bahsettigimiz, data tipinin hiyerarside en yuksek olana donusmesi bu durumda da gecerli.

> x = c(1,2,3)
> x
[1] 1 2 3
> y = c('a','b','c')
> y
[1] "a" "b" "c"
> z = c(x,y)
> z
[1] "1" "2" "3" "a" "b" "c"

Vektor aritmetigi

Daha onceden R’i hesap makinesi gibi kullanabileceginizden bahsetmistim. Vektorlerle de ayni islemleri yapabilirsiniz.

> x = c(1,2,3)
> x * 3
[1] 3 6 9
> x + 1
[1] 2 3 4
> (x * 5) -2
[1] 3 8 13

Burada onemli olan, islemlerin her bir oge uzerinde ayri ayri gerceklestiriliyor olusu. Eger iki vektorumuz olsaydi, ve bu iki vektoru toplamak isteseydik, benzer sekilde birinci ogenin ikinci vektordeki birinci ile, ikinci ogenin ikinci vektordeki ikinci oge ile vb. sekilde toplandigini gorurduk.

> x = c(1,2,3)
> y = c(4,5,6)
> x + y
[1] 5 7 9
> x * y
[1]  4 10 18

Peki ya vektorlerimiz esit uzunlukta degilse? Bu durumda kisa olan vektor, uzun vektordeki ogeler bitene kadar tekrar tekrar kullanilir.

> x = c(1,2,3,4)
> y = c(2,3)
> x * y
[1]  2  6  6 12

Ilk vektordeki ilk eleman olan 1, ikinci vektordeki ilk eleman olan 2 ile carpildi ve sonucun ilk elemani 2 oldu. Ilk vektordeki ikinci eleman olan 2, ikinci vektordeki ikinci eleman olan 3 ile carpildi ve sonucun ikinci elemani 6 oldu. Ilk vektordeki ucuncu eleman olan 3, ikinci vektorde ucuncu bir eleman olmamasi nedeniyle ilk eleman olan 2 ile carpildi ve sonucun ucuncu elemani 6 oldu. Ilk vektordeki dorduncu eleman olan 4, ikinci vektorde ikinci eleman olan 3 ile carpildi ve sonucun ucuncu elemani 12 oldu. Yani bu tarz islemleri yaparken dikkat etmek gerekiyor. Bu islemin sonucunda R’in nasil davranacagini bilmeyen birisi 8 elemanli bir vektor almayi, yani ilk vektoru once 2 ile sonra 3 ile carpip birlestirmis olmayi bekleyebilir. Oysa R boyle davranmiyor.

Peki ya vektorlerimizin uzunlugu birbirinin kati olmasaydi? Burada 4 ogeli bir vektoru 2 ogeli bir vektor ile carptik. 4 ogeli bir vektoru, 3 ogeli bir vektor ile carpmaya calissaydik farkli bir davranis bekler miyiz?

> x = c(1,2,3,4)
> y = c(1,2,3)
> x * y
[1] 1 4 9 4
Warning message:
In x * y : longer object length is not a multiple of shorter object length

Hayir. Tam olarak onceki gibi bir davranis goruyoruz, ancak bu sefer R ayni zamanda bir uyari mesaji veriyor ve vektorlerin birbirinin kati uzunlukta olmadigini soyluyor.

Vektor indeksleri (index)**

Bir vektorun icindeki elemanlara ulasmak icin koseli parantez [] operatorunu kullanabiliriz. Koseli parantez icine cagirmak – ulasmak istedigimiz ogenin indeksini – yani vektor icindeki sirasini yazarak istedigimiz elemana ulasabiliriz. Burada onemli olan bir konu, R diger kimi programlama dillerinin aksine 1-tabanli indeksleme kullaniyor, yani ilk elemanin indeksi 1 (Ornegin python’da ilk elemanin indeksi 0dir).

> x = c('a','b','c','d')
> x[1] # Birinci eleman
[1] "a"
> x[1:2] # Birinciden ikinciye kadar (dahil) elemanlar
[1] "a" "b"
> x[2:4] # Ikinciden dorduncuye kadar (dahil) elemanlar
[1] "b" "c" "d"
> x[-3] # Ucuncu haric tum elemanlar
[1] "a" "b" "d"
> x[c(1,3)] # Bir ve ucuncu elemanlar
[1] "a" "c"

Gordugunuz gibi, bu sistemle sadece tek bir eleman degil, istediginiz alt kumeye de ulasabilirsiniz.

Burada daha once gostermedigim baska bir operator (:) daha kullandik. Bu operatoru, bir dizi uretmek istedigimizde kullaniyoruz.

> 1:4
[1] 1 2 3 4
> 5:10
[1]  5  6  7  8  9 10

Tekrar indekslere donecek olursak, acikta biraktigimiz kimi sorular var.

> x = c('a','b','c','d')
> # olmayan bir elemani istemek NA verir
> x[5]
[1] NA
> # ayni indeksi tekrar tekrar isteyerek elemanin tekrar etmesini saglayabiliriz
> x[c(1,2,2,2,3)]
[1] "a" "b" "b" "b" "c"
> # elemanlari orijinal siralarina sadik kalarak cagirmak zorunda degiliz
> x[c(3,1,4)]
[1] "c" "a" "d"

Ayrica boolean vektor kullanarak vektor altkumesi almak da mumkun. Eger ki boolean TRUE ise, o indekse karsilik gelen eleman elde edilen altkumede yer alir, FALSE ise yer almaz.

> x = c('a','b','c','d')
> x[c(T,F,T,T)]
[1] "a" "c" "d"

**Bir itirafta bulunmam gerekiyor, index in dogru cevirisi indeks mi indis mi (benzer sekilde matrix in dogru cevirisi matriks mi matris mi) bilmiyorum. Bu tarz hatalari hosgormenizi ve hangisinin kullanildigini biliyorsaniz yorum olarak birakmanizi rica ediyorum.

Isimlendirilmis vektor

Simdiye kadar vektor icindeki elemanlari cagirmak icin hangi sirada olduklarini kullaniyorduk. Oysa eger ki vektor icindeki elemanlarin isimleri olsaydi bu isimleri kullanabilirdik.

> myvec = c(birinci='x',ikinci='y')
> myvec
birinci  ikinci 
    "x"     "y" 
> myvec[1]
birinci 
    "x" 
> myvec['ikinci']
ikinci 
   "y"

Vektore isim atamak, ornekteki gibi c() fonksiyonu icinde yapilabilecegi gibi sonradan names() fonksiyonu kullanarak da yapilabilir.

> a = c('x','y') 
> a
[1] "x" "y"
> isimvektorum = c('birinci','ikinci')
> isimvektorum
[1] "birinci" "ikinci" 
> names(a)=isimvektorum
> a
birinci  ikinci 
    "x"     "y"

Yararli bulduysaniz lutfen ilgili ortamlarda paylasarak daha fazla kisiye ulasmasina yardimci olabilirsiniz. Ve hatta yorum / oneri / elestirileriniz icin asagiya yorum birakabilir, icerigin daha iyi olmasini saglayabilirsiniz! Paylasimlardan haberdar olmak icin blog’u takip etmeyi unutmayin!

Temel obje turleri

Cok havali grafikler cizip, guzel istatistiksel analizler yapmadan once R’da temel bir kac konuya bakmak yapabilecegimiz kimi hatalari daha rahat anlamamizi saglayabilir. Bu sebeple biraz temellere bakalim.

R’da 5 cesit temel obje turu var:

  • karakter (character):
> x = 'a'
> x
[1] "a"
> a
Error: object 'a' not found

Karakter degiskeni yaratmak icin, tirnak isaretlerini kullaniyoruz. Yani, x bir obje iken ‘a’ bir karakter. Bu sebeple, a yazdiginizda R a isminde bir obje ariyor, bizim a isminde bir objemiz olmadigindan ‘obje bulunamadi’ hatasi veriyor. Bu arada R’da en iyi dostunuz hata mesajlari. Genelde hata mesaji sorunun nerede oldugu hakkinda cok iyi bir fikir veriyor.

> class(x)
[1] "character"

class() fonksiyonu tahmin edebileceginiz uzere, obje sinifini ogrenmemizi sagliyor.

> x = 'melike'
> x
[1] "melike"
> class(x)
[1] "character"

‘Karakter’ sinifindaki objeler, tek bir karakter icermek zorunda degil.

  • numerik (numeric)
> x = 3
> x
[1] 3
> class(x)
[1] "numeric"
> x = 3.14
> x
[1] 3.14
> class(x)
[1] "numeric"
> x = 1/0
> x
[1] Inf
> class(x)
[1] "numeric"
> x = 0/0
> x
[1] NaN
> class(x)
[1] "numeric"

Burada ilginc olan kisimlar var: 1) R tam sayilari da ozellikle belirtmedigimiz surece numerik olarak aliyor, 2) ‘Sonsuz’un veri tipi numerik, 3) NaN (“not a number’) degeri de numerik sinifinda.

  • tam sayilar (integer)
> x = 3L
> x
[1] 3
> class(x)
[1] "integer"

Gordugunuz gibi, ozellikle tam sayi olusturmak istiyorsak sondaki L ekini kullaniyoruz.

  • komplex (complex)
> x = 1+4i
> x
[1] 1+4i
> class(x)
[1] "complex"
  • mantiksal (logical, boolean)
> x = TRUE
> x
[1] TRUE
> class(x)
[1] "logical"
> x = FALSE
> x
[1] FALSE
> class(x)
[1] "logical"
> x = T
> x
[1] TRUE

TRUE ve FALSE iki temel mantiksal degisken (True=Dogru, False=Yanlis). Sadece bas harfleri kullanilarak da ifade edilebilirler.

> x = f
Error: object 'f' not found

Ancak gordugunuz gibi, bu harfler buyuk olmali yoksa f ismindeki objeye esitlemeye calismis oluyoruz x’i.


Alistirma olarak su objelerin siniflarini tahmin etmeye calisip yanilip yanilmadiginizi kontrol edebiliriz:

a='5' 
b='T'
y=10.5L
x='y'
d=x

Tirnak isaretleri icinde veriler girildiginden a, b, x, ve dolayisiyla d objeleri karakter tipinde. y ise integer degil numerik tipinde.


Ilerledikce class() fonksiyonu ile objelere baktiginizda, farkli cevaplar alacaksiniz. Objelerden olusan objeleriniz oldugunda ornegin (1den 10a kadar olan sayilari iceren bir vektorunuz varsa mesela). Ya da R’in object oriented programlama dili olmasinin getirisi olarak, yeni obje siniflari ile calistiginizda.

Eger ki acik bir obje sinifina sahipse bir obje (orn. matrix gibi), numerik degerlerden olusan bir obje mi, karakter objesi mi, bunu gormek yerine sinifini – orn. matrix – oldugunu goreceksiniz. Bu durumda mode() fonksiyonunu kullanabilirsiniz. Veri yapilarina (vektor, matrix, list gibi) alistikca bunlar daha anlasilir gelecektir.

Ilk adimlar

Her zaman kod yazmaya baslamadan once onemli olan bir basamak, calistigimiz klasorun ne oldugunu bilmek, gerekirse degistirmek.

Hangi klasorde calistigimizi ogrenmek icin getwd() fonksiyonunu kullanacagiz (get working directory). Calistigimiz klasoru belirlemek icinse setwd() fonksiyonu kullaniliyor.

> getwd()
[1] "/Users/melike"
> setwd('~/Dropbox/blog/compbioscratchpad/r_baslangic/')
> getwd()
[1] "/Users/melike/Dropbox/blog/compbioscratchpad/r_baslangic"

Onerim, bilgisayarinizda R ogrenmek icin bir klasor olusturmaniz ve kodunuzu, kullandiginiz dosyalari vs. buraya kaydetmeniz. Ayni sekilde, belirli bir amacla R kullandiginiz zaman da masaustune deneme1.R gibi isimler yerine duzenli bir sekilde uygun klasorleri icerige dair fikir veren isimlendirmelerle ya da belirli bir sistemle kaydederseniz hayatiniz cok kolaylasacaktir.


Hesap Makinesi olarak R

En temelde hesap makinesi islemleri yapabilirsiniz:

> 2+2
[1] 4
> 2*3
[1] 6
> 10-5
[1] 5
> 3^2
[1] 9
> 450/3
[1] 150
> 200/3
[1] 66.66667
> 200%%3
[1] 2
> 200%/%3
[1] 66

Cok acik olmayan operatorler:

  • %% – belirli bir tabanda kalan islemi, moduler aritmetik. Ornegimizde 200un 3e bolumunden kalan 2
  • %/% – tam sayi bolmesi, kalan olsa bile tam sayi olarak bolme isleminin sonucu kac?

Fonksiyonlar

R kendi icinde fonksiyonlar barindirir. Ornegin, baslangicta kullandigimiz getwd() gibi. Farkettiyseniz, fonksiyonlardan bahsederken hep parantez kullaniyorum. Fonksiyonlari degiskenlerden ayirabileceginiz en basit sekil bu. Cok basit bir kac fonksiyona bakalim:

> log10(100) #10 tabaninda log
[1] 2
> log2(100) #2 tabaninda log
[1] 6.643856
> log(10,4) #4 tabaninda 10un log'u
[1] 1.660964
> exp(1) #e uzeri 1
[1] 2.718282
> exp(2) # e uzeri 2
[1] 7.389056
> log(exp(2)) # e uzeri 2 nin ln i - log taban belirtilmediginde e tabaninda islem yapar
[1] 2
> 16^(1/2) # 16 nin koku
[1] 4
> sqrt(16) # ayni islem fonksiyon ile
[1] 4

R’da degiskenler

Degiskenler, veri tutucular olarak dusunulebilinir. R’da degiskene deger atamak icin = veya <- operatorleri kullanilabilir. Ornegin x’e 3 degerini atamak icin, asagidaki iki kod da gecerlidir.

> x = 3
> x
[1] 3
> a <- 4
> a
[1] 4
> 3 * 4
[1] 12
> x * a
[1] 12

<- tarihsel olarak R camiasinda cokca kullanilsa da, pratik nedenlerle ben genellikle = kullanmayi tercih ediyorum.

Degisken isimleri

R’da degiskenlerinize verebileceginiz isimler icin bazi sinirlayici kurallar vardir. Degiskenler, bir harf ile ya da harfin takip ettigi nokta ile baslar. Ornegin, benimdegiskenim gecerli bir degisken ismi iken 2degisken gecerli degildir, cunku 2 bir harf degildir. .degisken gecerli bir degisken ismidir ancak .2degisken degildir. Ayrica R’da kimi ozel anlam iceren kelimelerin degisken olarak kullanilmasi mumkun degildir, if ve for gibi. Bunlari ?reserved yazarak ogrenebilirsiniz.

Yasak olmasa da diger bir sorun R icinde varolan fonksiyonlarin isimleri ile degisken yaratmak. Cogu zaman sorun olmadan calissa bile, kimi zaman karisikliga sebep olabilir.

R’da degisken isimleri buyuk/kucuk harfe duyarlidir.

Degisken isimlerini tuttugu veriyle alakali secmek genelde kolaylik saglar.

R Ogrenmeye Nasil Baslarim?

Son zamanlarda bu soruyu o kadar cok duyuyorum ki! Arada dunyada guzel seyler de oluyor yani :) Neyse, tahmin edebileceginiz gibi sorunun kesin net bir cevabi yok, kisiden kisiye, kullanimdan kullanima farklilik gosterecektir en verimli yol. Ama yine de bir takim basamaklardan gecmemek imkansiz (R i bilgisayara indirmek gibi!). Biraz bu ‘mutlaka olmasi gereken maddeler’i biraz da kendimce yararli buldugum basamaklari toparlayip sunmak istedim.

1) R nedir, ne degildir?

R ile ilgili simdiye kadar en uygun buldugum, en cok hosuma giden benzetme Matthew Keller’a ait. Keller hatirladigim kadariyla diyor ki ‘R is like magic, except you have functions instead of spells’ – yani diyor ki R buyu gibi, ancak buyulu sozcukler yerine fonksiyonlariniz var. SPSS, SAS kullanicilari, ‘muggle’ gibidir. Ortami degistirme kabiliyetleri sinirlidir. Onlarin analizi icin birileri tarafindan uygun gorulmus dizayn edilmis algoritmalarla sinirlidirlar ve ustune para odemek zorundadirlar. Keller, R programcilari ise ‘buyucu’lere benzetiyor. R programcilar, alaninda uzman olan kisiler tarafindan yazilmis fonksiyonlara (yani buyulere) bagli kalarak devam edebilecekleri gibi kendi buyulerini de yaratabilirler (’sectumsempra’ gibi lanetler de mumkun tabii). Bunlari kullanmak / erismek icin para odemezler, ve yeterince deneyim kazandiklarinda yapamayacaklari bir sey yoktur.
Burada R in tarihine filan deginmek istemiyorum. Ancak bir kac avantaj listelemesi yapmadan gecmeyelim:
– Ucretsiz!
– Acik kaynak kodlu
– Aktif ve dinamik bir komunitesi var. Yardim almak cok kolay.
– Guncel
– Kod yazarken analiz hakkinda dusunmeniz gerekiyor. Bu sebeple yaptiginiz analizin, deney duzeneginize, ornekleminize ve en onemlisi hipotezinize uygun olup olmadigini tartabiliyorsunuz. Rastgele tuslara tiklayip p<0.05 gorunce alip devam etmekten oldukca farkli!
– Istatistiksel testlerin varsayimlarina bagli kalmadan, simulasyonlar ile empirik dagilimlar yaratip test yapabilirsiniz.
– R notebook / R markdown gibi dokuman olusturma sayesinde analizinizi / deneyinizi takip etmeniz kolay, yayinlamak kolay, ve tekrar edilebilirliginizi saglamak mumkun.
– Ozellikle rutin olarak biyoistatistik / biyoenformatik calismiyorsaniz, Windows kullanicisi olma ihtimaliniz cok yuksek. R isletim sisteminden bagimsiz oldugundan, kendi bilgisayarinizda calisabilir ve gerektiginde analizinizi / kodunuzu baska platformlarda calisanlarla rahatlikla paylasabilirsiniz.
– Bilim dili gunumuzde Ingilizce’ymis gibi gozukuyor. Ben buna katilmiyorum. Bilimin dili bence grafikler. Yazdiginiz 15 sayfalik makaleyi ozetleyebilecek 3 grafik yapabilmek cok buyuk bir guc (buyuk konustum, tabii her seyi grafiklestirmek mumkun degil ama zamanla makaleleri okurken farketmeye basliyorsunuz Excel, SPSS grafiklerinin R’da olusturulmus grafikler yaninda nasil kaldigini..)
ilk aklima gelenler ancak daha bir cok avantaji var.
Bir de ogrenmesi en kolay dillerden birisi. Ancak bunun yaninda ogrenme egrisi lineer degil. Yani ilk zamanlar cok zor gelebilir (ilk zamanlar cok basit olmasina ragmen kac defa matrix in satiri yerine sutunu ile islem yapmaya calistigimi anlatamam!) ama alistiktan sonra kendinizi gelistirmek, yeni fonksiyon hatta baskalarinin kullanimi icin paket yazmak diger dillere gore cok daha kolay.
Son olarak, R paket sayisi, paketlerin guncellenme sikligi, paket yazarlarinin ulasilabilirligi acisindan ozellikle biyoloji alaninda calisanlar acisindan cok avantajli. Bioconductor projesi ozellikle biyoloji ile alakali analizler icin -omics data analizi icin inanilmaz avantaj sagliyor.
Isin ozu, R candir.

2) R’i nasil indirecegim? 

Cok basit: https://cran.r-project.org adresine gidip, kullandigimiz isletim sistemi icin olan versiyonu indiriyoruz. Bir cok kullanici icin ‘base’ surumu yeterli olacaktir.

3) Indirdim, simdi sirada ne var?

R’i kuruyoruz. Bu kisimda cok faydam olamiyor genelde kimseye Windows kullanmadigim icin ama eminim sirasiyla tuslara basinca kurulum gerceklesiyordur 😃 kurmaya calisip bir noktada takilan olursa ekran goruntuleri ile yorum birakirsa, yardimci olmaya calisirim.

4) Baslamadan once kolaylastirici bir basamak:

R’in kendi arayuzu oldukca sade ve yeterli olsa da, ben herkese RStudio yu indirmelerini tavsiye ediyorum. Inanin hayatinizi cok kolaylastiriyor. RStudio da ucretsiz ve R programlama icin bir cesit arayuz gibi dusunebilirsiniz. https://www.rstudio.com/

5) Hadi kodlayalim!

devami gelecek..