Tag Archives: vektor

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!

Advertisements