Bölüm 5 Vektörler
R kimi veri yapıları üzerinde işlem yapar. En basit veri yapılarından biri olan vektörler, aynı temel obje türünden öğeler içeren dizilerdir.
= c(1,2,3)
x x
## [1] 1 2 3
Burada ‘x’; 1, 2, ve 3 öğelerine sahip bir vektördür. Vektör oluşturmak için bu örnekte c()
fonksiyonunu kullandık. c
yi, concatenate
(bağlamak) ya da combine
(birleştirmek) kelimelerinden birinin kısaltılmış hali olarak aklınızda tutabilirsiniz.
Önceki örnekte nümerik tipte öğelerden oluşan bir vektör yarattık. Ancak vektörler hepsi aynı olduğu sürece diğer tiplerden de oluşabilir.
= c(T,F,F) # logical
x x
## [1] TRUE FALSE FALSE
= c('x','y','aa','oiasjfioasjf') # character
x x
## [1] "x" "y" "aa" "oiasjfioasjf"
= c(1+4i,5+2i) # complex
x x
## [1] 1+4i 5+2i
= c(1L,5L) #integer
x x
## [1] 1 5
Şimdi de aynı tipte olmayan öğelerle vektör oluşturmaya çalıştığımızda ne oluyor, bunu görelim. İlk deneme olarak bütün tipleri girdi olarak verip bir vektör yaratmaya çalışalım.
= c(1.5, 'karakter', 3i+2, TRUE, F) x
Bu örnekte; nümerik, karakter, kompleks ve boolean tipinde öğelerle ile bir vektor yaratmak istedik. Ve hata almadık Peki ‘x’ objesinin modu ne ve nasıl bir vektor elde ettik?
x
## [1] "1.5" "karakter" "2+3i" "TRUE" "FALSE"
Hata almadık ama vektör oluşturma sırasında öğeler kendi modlarını koruyamadılar. Data tipleri arasında bir hiyerarşi vardır ve R farklı tipte öğeleri birleştirirken bu objelerde hiyerarşide en yüksek olanı seçerek vektör yaratır. Buradan yapacağımız çıkarım, karakter tipi hiyerarşide en yüksek olan. Şimdi sırasıyla en yüksekte olanı çıkartarak hiyerarşiyi çözmeye çalışalım.
# karakteri cikarttigimizda
= c(1.5, 3i+2, TRUE, F)
x mode(x)
## [1] "complex"
x
## [1] 1.5+0i 2.0+3i 1.0+0i 0.0+0i
# kompleksi cikarttigimizda
= c(1.5, TRUE, F)
x mode(x)
## [1] "numeric"
x
## [1] 1.5 1.0 0.0
# numerigi cikarttigimizda
= c(TRUE, F)
x mode(x)
## [1] "logical"
x
## [1] TRUE FALSE
Bu durumda boolean < nümerik < kompleks < karakter çıkarımını yapabiliriz.
5.1 Vektorleri birleştirmek
Vektör yaratmak için kullandığımız c() fonksiyonu, aynı zamanda vektörleri birleştirmek için de kullanılabilir.
= c(1,2,3)
x x
## [1] 1 2 3
= c(4,5,6)
y y
## [1] 4 5 6
= c(x,y)
z z
## [1] 1 2 3 4 5 6
= c(z,9,8)
a a
## [1] 1 2 3 4 5 6 9 8
Ve önceden bahsettiğimiz, data tipinin hiyerarşide en yüksek olana dönüştürülmesi bu durumda da geçerlidir.
= c(1,2,3)
x x
## [1] 1 2 3
= c('a','b','c')
y y
## [1] "a" "b" "c"
= c(x,y)
z z
## [1] "1" "2" "3" "a" "b" "c"
5.2 Vektor aritmetiği
Daha önce R’ı hesap makinesi gibi kullanabileceğimizi görmüştük. Vektörlerle de aynı işlemleri yapabilirsiniz.
= c(1,2,3)
x * 3 x
## [1] 3 6 9
+ 1 x
## [1] 2 3 4
* 5) -2 (x
## [1] 3 8 13
Burada önemli olan, işlemlerin her bir öğe üzerinde ayrı ayrı gerçekleştiriliyor oluşu. Eğer iki vektörümüz olsaydı,ve bu iki vektörü toplamak isteseysdik, benzer şekilde birinci öğenin ikinci vektördeki birinci öğe ile, ikinci öğenin ikinci vektördeki ikinci öğe ile vb. şekilde toplandığını görürdük.
= c(1,2,3)
x = c(4,5,6)
y + y x
## [1] 5 7 9
* y x
## [1] 4 10 18
Peki ya vektörlerimi eşit uzunlukta değilse? Bu durumda kısa olan vektor, uzun vektordeki öğeler bitene kadar tekrar tekrar kullanılır.
= c(1,2,3,4)
x = c(2,3)
y * y x
## [1] 2 6 6 12
- İlk vektördeki ilk eleman olan 1, ikinci vektördeki ilk eleman olan 2 ile çarpıldı ve sonucun ilk elemanı 2 oldu.
- İlk vektördeki ikinci eleman olan 2, ikinci vektördeki ikinci eleman olan 3 ile çarğıldı ve sonucun ikinci elemanı 6 oldu.
- İlk vektördeki üçüncü eleman olan 3, ikinci vektörde üçüncü bir eleman olmamasından dolayı ilk eleman olan 2 ile çarpıldı ve sonucun üçüncü elemanı 6 oldu.
- İlk vektördeki dördüncü eleman olan 4, ikinci vektörde ikinci eleman olan 3 ile çarpıldı ve sonucun üçüncü elemanı 12 oldu.
Yani bu tarz işlemleri yaparken dikkat etmek gerekiyor. Bu işlemin sonucunda R’ın nasıl davranacağını bilmeyen birisi 8 elemanlı bir vektör almayı, yani ilk vektör önce 2 sonra 3 ile çarpıp birleştirilir diye bekleyebilir örneğin. Ancak R böyle davranmıyor.
Peki ya vektörlerimizin uzunluğu birbirinin katı olmasaydı? Burada 4 öğeli bir vektörü 2 öğeli bir vektör ile çarptık. 4 öğeli bir vektörü, 3 öğeli bir vektör ile çarpmaya çalışsaydık farklı bir davranış bekler miyiz?
= c(1,2,3,4)
x = c(1,2,3)
y * y x
## Warning in x * y: longer object length is not a multiple of shorter object
## length
## [1] 1 4 9 4
Hayır. Tam olarak önceki gibi bir davranış görüyoruz, ancak bu sefer R aynı zamanda bir uyarı mesajı veriyor ve vektörlerin birbirinin katı uzunlukta olmadığını söylüyor.
5.3 Vektör indisleri
Bir vektörün içindeki elemanlara ulaşmak için köşeli parantez []
operatorunu kullanabiliriz. Köşeli parantez içine çağırmak - ulaşmak istediğimiz öğenin indeksini, yani vektör içindeki sırasını yazarak istediğimiz elemana ulaşabiliriz. Burada önemli olan bir konu, R diğer kimi programlama dillerinin aksine 1-tabanlı indeksleme kullanıyor, yani ilk elemanın indeksi 1 (Örneğin python’da ilk elemanın indeksi 0dır).
= c('a','b','c','d')
x 1] # Birinci eleman x[
## [1] "a"
1:2] # Birinciden ikinciye kadar (dahil) elemanlar x[
## [1] "a" "b"
2:4] # Ikinciden dorduncuye kadar (dahil) elemanlar x[
## [1] "b" "c" "d"
-3] # Ucuncu haric tum elemanlar x[
## [1] "a" "b" "d"
c(1,3)] # Bir ve ucuncu elemanlar x[
## [1] "a" "c"
Gördüğünüz gibi, bu sistemle sadece tek bir eleman değil, istediğiniz alt kümeye de ulaşabilirsiniz.
Burada daha önce görmediğimiz başka bir operatör (:
) daha kullandık. Bu operatörü, bir dizi üretmek istediğimizde kullanıyoruz.
1:4
## [1] 1 2 3 4
5:10
## [1] 5 6 7 8 9 10
Tekrar indekslere dönecek olursak, açıkta bıraktığımız kimi sorular var.
= c('a','b','c','d')
x # olmayan bir elemani istemek NA verir
5] x[
## [1] NA
# ayni indeksi tekrar tekrar isteyerek elemanin tekrar etmesini saglayabiliriz
c(1,2,2,2,3)] x[
## [1] "a" "b" "b" "b" "c"
# elemanlari orijinal siralarina sadik kalarak cagirmak zorunda degiliz
c(3,1,4)] x[
## [1] "c" "a" "d"
Ayrıca boolean vektör kullanarak vektör altkümesi almak da mümkün. Eğer ki boolean TRUE
ise, o indekse karşılık gelen eleman elde edilen altkümede yer alır, FALSE
ise yer almaz.
= c('a','b','c','d')
x c(T,F,T,T)] x[
## [1] "a" "c" "d"
5.4 İsimlendirilmiş vektör
Şimdiye kadar vektör içindeki elemanları çağırmak için hangi sırada olduklarını kullanıyorduk. Oysa eğer ki vektör içindeki elemanların isimleri olsaydı bu isimleri kullanabilirdik.
= c(birinci='x',ikinci='y')
myvec myvec
## birinci ikinci
## "x" "y"
1] myvec[
## birinci
## "x"
'ikinci'] myvec[
## ikinci
## "y"
Vektöre isim atamak, örnekteki gibi c()
fonksiyonu içinde yapılabileceği gibi, sonradan names()
fonksiyonu kullanılarak da yapılabilir.
= c('x','y')
a a
## [1] "x" "y"
= c('birinci','ikinci')
isimvektorum isimvektorum
## [1] "birinci" "ikinci"
names(a)=isimvektorum
a
## birinci ikinci
## "x" "y"