Matrisler vektorler ve listlerin aksine cok boyutlu veri tipleridir. Yani hem x hem de y ekseninde veri bulundururlar. Veri ve istatistik alanlarinda bunlara row ve column deriz. Su ana kadar gordugumuz veri yapilari hep tek boyutluydu. Boylece, R ile bolca kullanacagimiz veri sekline giris yapmis oluyoruz.
Matrisler, ileride gorecegimiz array veri tipinin bir formu olarak dusunulebilinir. Array formu 2den fazla boyut alabilirken matrisler 2 boyutludur. Genellikle numeric verileri gostermek icin kullanilir.
Matris olusturmak icin matrix() komutunu kullaniriz.
Burada ilk girdigimiz veri matris icinde olacak veriler. Ornek icin 1:12 arasindaki sayilari girmesini soyledim. nrow komutu ise kac row istedigimizi, ncol ise kac column istedigimizi belirtiyor. Bunu 3 4 veya 6 2 gibi farkli sekillerde de yapabilirdim. byrow ise sayilarin nasil doldurulmasini istedigimizi soyluyor. Bunu TRUE yaptigimiz zaman sayilari ilk once birinci rowa sonra ikinci rowa olmak uzere dizecek. Eger FALSE deseydik de ilk once ilk columni dolcuracak ve sonra ikinci columna gececekti
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
Row ve column isimlendirmesi yapmak istiyorsak rownames ve colnames komutlarini kullanabiliriz.
rownames(matrix2) <- c("Ilk satir", "Ikinci satir",
"Ucuncu satir", "Dorduncu satir")
colnames(matrix2) <- c("Ilk sutun", "Ikinci sutun",
"Ucuncu sutun")
matrix2
Ilk sutun Ikinci sutun Ucuncu sutun
Ilk satir 1 5 9
Ikinci satir 2 6 10
Ucuncu satir 3 7 11
Dorduncu satir 4 8 12
Ancak bu sekilde ugrasmadan daha basit bir sekilde isimlendirme yapabiliriz. Burada tercih kullanan kisiye kalmis. Bazilari tek komut icinde yazmayi zor bulabilecegi icin ilk yontemi tercih edebiliriz ama daha kisa bir sekilde ayni sonuca erismek mumkun oldugu icin ikinci yontem de tercih edilebilir.
Bu komut opsiyonel olarak eklenen dimnames komutu. Boylece hem rowlara hem de columnlara ayni anda isim vermemiz mumkun.
matrix2 <- matrix(1:12, nrow = 4, ncol = 3, byrow = FALSE,
dimnames = list(c("Satir 1", "Satir 2",
"Satir 3", "Satir 4"),
c("Sutun 1", "Sutun 2",
"Sutun 3")))
matrix2
Sutun 1 Sutun 2 Sutun 3
Satir 1 1 5 9
Satir 2 2 6 10
Satir 3 3 7 11
Satir 4 4 8 12
Isterdigimiz bir vektoru matrise donusturebiliriz.
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
Burada dikkatimizi cekebilecek bir nokta byrow argumanini girmemem. Cunku default olarak byrow argumanu false degerini alir. Boyle oldugu icin belirtmedigim zaman dogrudan columnlara gore dolduruyor.
Istersek iki vektoru birlestirip matris olusturabiliriz
yeni_vektor1 <- c(1,2,3,4)
yeni_vektor2 <- c(5,6,7,8)
rowmatrix <- rbind(yeni_vektor1, yeni_vektor2)
columnmatrix <- cbind(yeni_vektor1, yeni_vektor2)
rowmatrix
[,1] [,2] [,3] [,4]
yeni_vektor1 1 2 3 4
yeni_vektor2 5 6 7 8
yeni_vektor1 yeni_vektor2
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
Matrisler hakkinda bilgilere kolay komutlarla ulasabiliriz. Bu komutlar bundan sonra gorecegimiz data frame veri tipinde de cok isimize yarayacak.
[1] 5 2
[1] 5
[1] 2
[1] 10
int [1:5, 1:2] 1 2 3 4 5 6 7 8 9 10
Matrislerin icindeki elementlere vektorlerde yaptigimiz gibi erisebiliriz. Ancak cok boyutlu veriler oldugu icin amiral batti oyunu oynar gibi column ve row sayisini belirtip elementi almamiz gerekir.
Tek elemente ulasmak icin
[1] 10
Butun rowa ulasmak icin
Sutun 1 Sutun 2 Sutun 3
2 6 10
Butun columna ulasmak icin
Satir 1 Satir 2 Satir 3 Satir 4
9 10 11 12
Belli bir araliktaki elementlere ulasmak icin
Sutun 1 Sutun 2 Sutun 3
Satir 2 2 6 10
Satir 3 3 7 11
Satir 4 4 8 12
Sadece belli kriteri karsilayan elementlere ulasmak icin
[1] 8 9 10 11 12
Matrisler ile hesaplama ve degisiklik islemleri yapmamiz mumkundur.
Matrisin icindeki bir elementi degistirmek istiyorsak
Sutun 1 Sutun 2 Sutun 3
Satir 1 1 5 47
Satir 2 2 6 10
Satir 3 3 7 11
Satir 4 4 8 12
Butun bir rowu degistirmek istiyorsak
Sutun 1 Sutun 2 Sutun 3
Satir 1 1 5 47
Satir 2 26 38 73
Satir 3 3 7 11
Satir 4 4 8 12
Butun bir columnu degistirmek istiyorsak
Sutun 1 Sutun 2 Sutun 3
Satir 1 54 5 47
Satir 2 19 38 73
Satir 3 63 7 11
Satir 4 97 8 12
Matrislere sonradan row ve column eklemesi de yapabiliriz.
Sutun 1 Sutun 2 Sutun 3
Satir 1 54 5 47
Satir 2 19 38 73
Satir 3 63 7 11
Satir 4 97 8 12
9 11 13
Sutun 1 Sutun 2 Sutun 3
Satir 1 54 5 47 8
Satir 2 19 38 73 12
Satir 3 63 7 11 16
Satir 4 97 8 12 20
9 11 13 24
Matrisler ustunde aritmetik islemler yapmak istiyorsak dikkat etmemiz gereken belli noktalar vardir.
Elementler ustunde 4 islem yapmak istiyorsak iki matrisin de boyutlari ayni olmali. Yani birinde 3 row varsa digerinde de 3 row, birinde 5 column varsa digerinde de 5 column olmali. Ancak matris carpimi yapiyorsak, yani elementler ustunden degil de matarisin kendisi ustunden islem yapiyorsak bir matristeki row sayisi digerindeki column sayisine ve birindeki column sayisi digerindeki row sayisina esit olmali.
Aritmetik islemler
Toplama
[,1] [,2]
[1,] 6 10
[2,] 8 12
Cikarma
[,1] [,2]
[1,] -4 -4
[2,] -4 -4
Carpma
[,1] [,2]
[1,] 5 21
[2,] 12 32
Bolme
[,1] [,2]
[1,] 0.2000000 0.4285714
[2,] 0.3333333 0.5000000
Matrislerin row ve columnlarinin sayilarini transpose yaparak degistirebiliriz. Bu matrix carpimi yapmak icin isimize yarayacak.
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
Daha onceden de soyledigim gibi matris carpimi yapmak icin iki matrisin column sayilari row sayilariyla eslesmeli. Az once transpose ederek matrisimizin column ve rowlarini degistirmistik. Bu da bizim matris carpimi yapmamiza olanak sagliyor. Matris carpiminin olayi su. Iki matrisi carptigimiz zaman bir matrisimizde 5 row, diger matrisimizde 5 column oldugu icin elde edecegimiz matrix 5x5 olacak. Bu elde edecegimiz yeni 5x5 matrisin ilk rowunun ilk columundaki elementi hesaplamak icin hesaplamaya soktugumuz matrisin ilk satiri ile ikinci matrisin ilk sutunundaki elementleri carpip topluyoruz. Cikan sonucu oraya yaziyoruz. Sonrasinda her islem icin bu gerceklestiriliyor.
[,1] [,2] [,3] [,4]
[1,] 14 32 50 68
[2,] 32 77 122 167
[3,] 50 122 194 266
[4,] 68 167 266 365
Ayni tip verinin tekli veya coklu boyutla store edilmesine yarar. Vektorler ozunde tek boyutlu arrayler olarak dusunulebilinir. Ancak array dedigimiz zaman genellikle birden fazla boyutlu veri tiplerinden bahsederiz. Vektorlerde ve matrislerde oldugu gibi arraylerde ayni veri tipinden olusmak zorundadir. Matrisleri arraylerin 2 boyutlu bir tipi olarak dusunmemiz de mumkundur. Arrayler ise 3 ve daha fazla boyuta sahip olabilirler. Diger array tipleri gibi burada da array icine girilen verilen ayni tipten olmak zorundadir.
Array olusturmak array komutunu kullaniriz. Burada 2 boyutlu ve matrislerden de aliskin oldugumuz bir goruntu var. Ancak arrayler birden fazla boyuta sahip olabilecegi icin farklari orada ortaya cikacak.
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
Birden cok boyutta array yaratmak icin
array_3d <- array(1:12, dim = c(2, 3, 2), dimnames =
list(c("Row1", "Row2"), c("Col1",
"Col2", "Col3"),
c("Matrix1", "Matrix2")))
array_3d
, , Matrix1
Col1 Col2 Col3
Row1 1 3 5
Row2 2 4 6
, , Matrix2
Col1 Col2 Col3
Row1 7 9 11
Row2 8 10 12
Burada matrixlerde oldugu gibi tekli elementlere rahatca ulasabiliriz. Tek yapmamiz gereken ucuncu bir sayi olarak hangi matrise ulasmak istedigimizi belirtmek. Bu en son eristigimiz kisma ayni zamanda layer de denir.
[1] 11
R’da programlama yapmiyorsak, sifirdan bir veri olusturmaya calismiyorsak veya denemeler yapmiyorsak en cok karsilacaganiz veri tipi bu. Excel, STATA gibi verileri R ile okumayi ilerde ogrenecegiz. Bu verileri okudugumuz zaman format Data Frame olacak. Ondan dolayi en cok karsilasilan ve bilnen format budur. Ayni zamanda R paketleri de data frame ile calismaya uygun yapilir.
Data frameleri arraylerin daha guclu bir formu olarak dusunebiliriz. Arraylerin aksine farkli veri tiplerini bulundurabilirler. Bu konudaki en iyi karsilastirma Excel Spreadsheetleri. Dataframeler Excel kullaniminin R’a getirilmis hali gibi. R’da bir veriyle calisacak ve ozellikle siyaset bilimi ve public policy gibi alanlarda bu %95 data frame olarak gelir. ANCAK her columndaki veri tipi ayni olmalidir. Farkli veri tipleri sadece farkli columnlarda olabilir.
Data framelerin bir onemli ozelligi her columnda ayni sayida row olmasi gerekliligidir. Eger yoksa verimizde NA dedigimiz degerler olur ve bir analiz yaparken bu degerler analize dahil olmaz.
Ayni zamanda data framelerde her column ismi farkli olmalidir. Ayni column ismi birden fazla sutune verilemez. Genel olarak sutunlara degiskenleri, rowlara ise observationlari koyariz.
Data frame olusturmak icin data.frame komutunu kullaniriz ve vektorler ile benzer bir mantik izleriz. Sonuc olarak vektorler bir boyutlu arraylerdir, data frame ise 2 boyutlu arraydir.
ornek_df <- data.frame(
isim = c("Ece", "Onur", "Zeynep"),
yas = c(28, 29, 27),
kadin = c(TRUE, FALSE, TRUE)
)
ornek_df
isim yas kadin
1 Ece 28 TRUE
2 Onur 29 FALSE
3 Zeynep 27 TRUE
Data framelerde verilere farkli sekillerde erisebiliriz. Ileride tidyverse paketi ile bunu nasil daha kolayca yapacagimizi gorecegiz ama simdilik base R ustunden komutlara bakacagiz.
Tek bir elementi almak icin
[1] TRUE
Bir columnu ismini kullanarak almak icin
[1] "Ece" "Onur" "Zeynep"
Birden fazla columna erismemiz de mumkun
isim yas
1 Ece 28
2 Onur 29
3 Zeynep 27
Bu columnu almak icin bracketlar yerine dogrudan column ismini de $ operatoru ile alabiriz. Eger dataframe R environmentinda kayitliysa R Studio bunu otomatik olarak dolduracak ve isimizi kolaylastiracak.
[1] "Ece" "Onur" "Zeynep"
Data framelere yeni bir column ekleyebiliriz
isim yas kadin genc
1 Ece 28 TRUE FALSE
2 Onur 29 FALSE FALSE
3 Zeynep 27 TRUE FALSE
Yeni bir row da ekleyebiliriz
yeni_kisi <- data.frame(isim = "Mustafa", yas = 23,
kadin = FALSE, genc = TRUE)
ornek_df <- rbind(ornek_df, yeni_kisi)
ornek_df
isim yas kadin genc
1 Ece 28 TRUE FALSE
2 Onur 29 FALSE FALSE
3 Zeynep 27 TRUE FALSE
4 Mustafa 23 FALSE TRUE
Data frameler hakkindaki bilgileri goruntulemek icin
isim yas kadin genc
1 Ece 28 TRUE FALSE
2 Onur 29 FALSE FALSE
3 Zeynep 27 TRUE FALSE
4 Mustafa 23 FALSE TRUE
isim yas kadin genc
1 Ece 28 TRUE FALSE
2 Onur 29 FALSE FALSE
3 Zeynep 27 TRUE FALSE
4 Mustafa 23 FALSE TRUE
## [1] 4
## [1] 4
## 'data.frame': 4 obs. of 4 variables:
## $ isim : chr "Ece" "Onur" "Zeynep" "Mustafa"
## $ yas : num 28 29 27 23
## $ kadin: logi TRUE FALSE TRUE FALSE
## $ genc : logi FALSE FALSE FALSE TRUE
Data frameler ile dikkat etmemiz gereken bir nokta column isimlerinin anlamli olmasidir. Boylece kullanan kisi biz veya baskasi da olsak hangi sutundan ne aldigini anlayabilmeli. Daha onemli olan bir nokta ise ayni data frame ustune donusum islemleri yapilmamali ve eger bir veri ekleyip cikariyorsak veya degisiklikler yapiyorsak bunlari yeni bir dataframe olarak kaydetmek daha iyi olur. Verinin orijinal hali her zaman korunmali.
Ileride daha genis isleyecegiz ama data frameleri subset etmemiz de mumkun
isim yas kadin genc
1 Ece 28 TRUE FALSE
3 Zeynep 27 TRUE FALSE
Benzer sekilde row ve column cikarmamiz da mumkundur.
isim yas kadin genc
1 Ece 28 TRUE FALSE
2 Onur 29 FALSE FALSE
4 Mustafa 23 FALSE TRUE
Bunu endekse gore de yapabiliriz
isim yas kadin genc
1 Ece 28 TRUE FALSE
3 Zeynep 27 TRUE FALSE
4 Mustafa 23 FALSE TRUE
Columnlarda isme gore
isim kadin genc
1 Ece TRUE FALSE
2 Onur FALSE FALSE
3 Zeynep TRUE FALSE
4 Mustafa FALSE TRUE
Columnlarda endekse gore
yas kadin genc
1 28 TRUE FALSE
2 29 FALSE FALSE
3 27 TRUE FALSE
4 23 FALSE TRUE
Istersek farkli data frameleri rowlara ve columnlara gore birlestirebiliriz
ornek_df2 <- data.frame(
isim = c("Can", "Merve", "Berk"),
yas = c(24, 31, 26),
kadin = c(FALSE, TRUE, FALSE),
genc = c(TRUE, FALSE, FALSE)
)
birlesik_df <- rbind(ornek_df2, ornek_df)
birlesik_df
isim yas kadin genc
1 Can 24 FALSE TRUE
2 Merve 31 TRUE FALSE
3 Berk 26 FALSE FALSE
4 Ece 28 TRUE FALSE
5 Onur 29 FALSE FALSE
6 Zeynep 27 TRUE FALSE
7 Mustafa 23 FALSE TRUE
ornek_df3 <- data.frame(
boy = c(170, 172, 164, 183),
kilo = c(60, 75, 55, 80)
)
birlesik_df2 <- cbind(ornek_df3, ornek_df)
birlesik_df2
boy kilo isim yas kadin genc
1 170 60 Ece 28 TRUE FALSE
2 172 75 Onur 29 FALSE FALSE
3 164 55 Zeynep 27 TRUE FALSE
4 183 80 Mustafa 23 FALSE TRUE
Data frameler ustunde aritmetik islem yapmamiz mumkundur. Elbet bunu butun dataframe ustunde degil de column bazli yapabiliriz.
Daha az kullanilsa bile R dataframelerinin daha basit ve modern bir sekli olarak dusunebiliriz. Ileride detaylica ogrenecegimiz tidyverse ekosistemi icinde bir veri tipi. Bu tipin bir avantaji column isimlerinin veri tipinin degismemesi. R bazen dataframelerde column isimlerindeki bosluklari noktalara degistiriyor. Eskiden verilerde bir string columnu aldigi zamansa onu otomatikman faktor yapiyordu. Tibble ise bunlari yapmadan veriyi oldugu gibi aliyor. Boylece beklenmedik errorlerin onune gecebiliyor.
Ayni zamanda veri setleriyle calisirken veri setini print ettigimiz durumda daha basit bir gorunum ile gosteriyor. Asil farkli 100lerce rowu olan daha buyuk veri setlerinde ortaya cikiyor. Cunku verisetini print ettigimiz zaman R 100 rowa kadar gosterebilirken Tibble bunu 10 ile sinirliyor.
ornek_tibble <- tibble(
isim = c("Ece", "Onur", "Zeynep"),
yas = c(28, 39, 27),
sehir = c("Paris", "Istanbul", "Luxembourg")
)
ornek_tibble
# A tibble: 3 × 3
isim yas sehir
<chr> <dbl> <chr>
1 Ece 28 Paris
2 Onur 39 Istanbul
3 Zeynep 27 Luxembourg
Elimizdeki dataframeleri tibble formatina donusturmek mumkun
Ayni dataframelerde oldugu gibi Tibble verilerine erisiyoruz.
[1] 28 29 27 23
[1] 28 29 27 23
Ayni listelerde oldugu gibi cift bracket kullanmaya dikkat etmeliyiz. Yoksa bize vektor degil de tibble verecektir.
## # A tibble: 4 × 1
## yas
## <dbl>
## 1 28
## 2 29
## 3 27
## 4 23
Tibble ustunde yapilacak tidyverse islemlerini ileryen donemde data frame kisminda inceleyecegiz. Tibble her ne kadar basit veri girislerinde ise yarayan bir format olsa bile dataframe hala temel format olma ozelligini koruyor. Internetten alacagimiz veriler de genelde data frame olarak alinacagi icin ve yukarida bahsettigim kucuk farklar haricinde ciddi bir avantaji olmadigi icin data frame temel odak noktamiz olacak.