Data Frame

Data frame, R’da verileri tablo şeklinde kaydetmek icin kullanilir. Data frameler yapı olarak matristlere benzer fakat matristlerde her sütundaki veriler aynı türden olmak zorundadır. Bu noktada data frame ön plana çıkıyor çünkü data frame içinde bulunan farklı sütunlar, farklı türden veri içerebilir.

Peki data frameler nasıl oluşturulur?

df_1 <- data.frame(
  mevsim = c("ilkbahar", "yaz", "sonbahar", "kış"),
  ort_sicaklik = c(16.2, 28.6, 18.1, 7.9)
  )

df_1
##     mevsim ort_sicaklik
## 1 ilkbahar         16.2
## 2      yaz         28.6
## 3 sonbahar         18.1
## 4      kış          7.9
nrow(df_1) # nrow() fonksiyonu ile satir sayisina erişiriz
## [1] 4
ncol(df_1) # ncol() fonksiyonu ile sütun sayisina erişiriz
## [1] 2

İki data frame nasıl birleştirilir ?

df_2 <- data.frame(
  kitap_adi = c("marsli", "ucurtma avcisi", "olu ozanlar dernegi"),
  sayfa_sayisi = c(416, 424, 136),
  yazar = c("Andy Weir", "Khaled Hosseini", "N. H. Kleinbaum")
)
df_2
##             kitap_adi sayfa_sayisi           yazar
## 1              marsli          416       Andy Weir
## 2      ucurtma avcisi          424 Khaled Hosseini
## 3 olu ozanlar dernegi          136 N. H. Kleinbaum
df_3 <- data.frame(
  film_adi = c("marsli", "ucurtma avcisi", "olu ozanlar dernegi"),
  film_suresi = c(140, 122, 128),
  yonetmen = c("Peter Weir", "Marc Forster", "Peter Weir")
)
df_3
##              film_adi film_suresi     yonetmen
## 1              marsli         140   Peter Weir
## 2      ucurtma avcisi         122 Marc Forster
## 3 olu ozanlar dernegi         128   Peter Weir
df_column <- cbind(df_2, df_3)  # iki data frame yan yana eklenir
df_column
##             kitap_adi sayfa_sayisi           yazar            film_adi
## 1              marsli          416       Andy Weir              marsli
## 2      ucurtma avcisi          424 Khaled Hosseini      ucurtma avcisi
## 3 olu ozanlar dernegi          136 N. H. Kleinbaum olu ozanlar dernegi
##   film_suresi     yonetmen
## 1         140   Peter Weir
## 2         122 Marc Forster
## 3         128   Peter Weir
# ayni sekilde rbind() fonksiyonu ise iki data frame i alt alta ekler

# fonksiyon kullanmadanda iki data frame birleştirilebilir

df_4 <- data.frame(
  df_2,
  df_3
)

df_4
##             kitap_adi sayfa_sayisi           yazar            film_adi
## 1              marsli          416       Andy Weir              marsli
## 2      ucurtma avcisi          424 Khaled Hosseini      ucurtma avcisi
## 3 olu ozanlar dernegi          136 N. H. Kleinbaum olu ozanlar dernegi
##   film_suresi     yonetmen
## 1         140   Peter Weir
## 2         122 Marc Forster
## 3         128   Peter Weir

df_1 ve df_2 data framelerini cbind() fonksiyonu ile birleştirirken kitap_adi ve film_adi değişkenlerinin aynı gözlemlere sahip olduğunu görmüşsünüzdür. merge() fonksiyonu ile bu sorunu ortadan kaldırabiliriz. Ancak bu iki degiskenin isimleri aynı olmalıdır.

# colnames() fonksiyonu ile sutunlari adlandirirken, rownames() fonksiyonu ile satirlari isimlendiririz

colnames(df_3) <- c("kitap_adi", "film_suresi", "yonetmen") # merge() fonksiyonunu kullanabilmek icin  film_adi olan degiskeni kitap_adi olarak degistirdik

df_column_2 <- merge(df_2, df_3, by = "kitap_adi") 

df_column_2
##             kitap_adi sayfa_sayisi           yazar film_suresi
## 1              marsli          416       Andy Weir         140
## 2 olu ozanlar dernegi          136 N. H. Kleinbaum         128
## 3      ucurtma avcisi          424 Khaled Hosseini         122
##       yonetmen
## 1   Peter Weir
## 2   Peter Weir
## 3 Marc Forster

str() FONKSİYONU

# str() fonksiyonu sayesinde her bir gozlem ve degisken hakkinda bilgi sahibi olabiliriz. Ayrica df_2 orneginde df_2  nin data.frame oldugu da belirtilmis.

str(df_2)
## 'data.frame':    3 obs. of  3 variables:
##  $ kitap_adi   : Factor w/ 3 levels "marsli","olu ozanlar dernegi",..: 1 3 2
##  $ sayfa_sayisi: num  416 424 136
##  $ yazar       : Factor w/ 3 levels "Andy Weir","Khaled Hosseini",..: 1 2 3

VERİ SEÇME

df_3[["film_suresi"]]  # film_suresi verilerini vektor olarak verir
## [1] 140 122 128
df_3["film_suresi"] # film_suresi verileri data frame olarak verilir
##   film_suresi
## 1         140
## 2         122
## 3         128
df_2[c("kitap_adi", "yazar")] # secilen degiskenleri data frame olarak verir
##             kitap_adi           yazar
## 1              marsli       Andy Weir
## 2      ucurtma avcisi Khaled Hosseini
## 3 olu ozanlar dernegi N. H. Kleinbaum
# data frame icindeki degiskenlerin, gozlemlerini almak icin $ isareti kullanabiliriz.

df_2$kitap_adi
## [1] marsli              ucurtma avcisi      olu ozanlar dernegi
## Levels: marsli olu ozanlar dernegi ucurtma avcisi
df_2$sayfa_sayisi
## [1] 416 424 136
df_2$yazar
## [1] Andy Weir       Khaled Hosseini N. H. Kleinbaum
## Levels: Andy Weir Khaled Hosseini N. H. Kleinbaum
# ayni zamanda

df_2[1] # secili data frame in 1. sutununun degerlerini verir
##             kitap_adi
## 1              marsli
## 2      ucurtma avcisi
## 3 olu ozanlar dernegi
df_2[1, ] # secili data frame in 1. satirinin degerlerini verir
##   kitap_adi sayfa_sayisi     yazar
## 1    marsli          416 Andy Weir
df_2[ ,1] # secili dara frame in 1. sutununun degerlerini verir
## [1] marsli              ucurtma avcisi      olu ozanlar dernegi
## Levels: marsli olu ozanlar dernegi ucurtma avcisi
df_2[2,2] # secili data frame in 2. satir, 2. sutun degerini verir
## [1] 424
# ayni zamanda subset() fonksiyonlarini da kullanabiliriz

subset(df_2, select = kitap_adi) # bize df_2 data frame i icindeki kitap_adi degerlerini verir
##             kitap_adi
## 1              marsli
## 2      ucurtma avcisi
## 3 olu ozanlar dernegi
subset(df_2, select = c(kitap_adi, yazar)) # subset() fonksiyonu ile birden fazla da degisken cekebiliriz
##             kitap_adi           yazar
## 1              marsli       Andy Weir
## 2      ucurtma avcisi Khaled Hosseini
## 3 olu ozanlar dernegi N. H. Kleinbaum
subset(df_2, subset = (sayfa_sayisi>200)) # sayfa sayisi 200 den buyuk olan verileri yazdirir
##        kitap_adi sayfa_sayisi           yazar
## 1         marsli          416       Andy Weir
## 2 ucurtma avcisi          424 Khaled Hosseini
subset(df_2, select = c(kitap_adi, yazar), subset = (sayfa_sayisi<200)) # sayfa sayisi 200 den kucuk olan kitaplarin adini ve yazarini verir
##             kitap_adi           yazar
## 3 olu ozanlar dernegi N. H. Kleinbaum

** EKSİK VERİLERİ TEMİZLEME**

Data frame içindeki NA ile gösterilen veriler eksik veri olarak adlandırılır. Bu eksik verileri temizlemezsek çalışmalarımızda sorunlar çıkabilir.Özellikle büyük veriler ile çalıştığımızda işimiz daha zorlaşır. Eksik verileri temizleyerek yeni bir data frame oluşturmak istersek na.omit fonksiyonu kullanabiliriz.

df_5 <- data.frame(
  ogrenci_isim = c("Ali", "Ayşe", "Berk", "Buse", "Cemal", "Ceyda"),
  ogrenci_no = c(619, 215, NA, 911, 128, 397),
  mat_notu = c(69, 95, 25, 86, 56, 99),
  fizik_notu = c(56, 87, 12, 92, 18, 100),
  kimya_notu = c(65, 93, NA, 88, NA, 95)
)

df_5
##   ogrenci_isim ogrenci_no mat_notu fizik_notu kimya_notu
## 1          Ali        619       69         56         65
## 2         Ayşe        215       95         87         93
## 3         Berk         NA       25         12         NA
## 4         Buse        911       86         92         88
## 5        Cemal        128       56         18         NA
## 6        Ceyda        397       99        100         95
df_6 <- na.omit(df_5)

df_6 
##   ogrenci_isim ogrenci_no mat_notu fizik_notu kimya_notu
## 1          Ali        619       69         56         65
## 2         Ayşe        215       95         87         93
## 4         Buse        911       86         92         88
## 6        Ceyda        397       99        100         95

df_6 da görüleceği üzere 3. ve 5. gözlemlerde eksik veriler oldugu icin bu gözlemleri temizledik ve df_6 ya atadık.

Ayrıca complete.cases() fonksiyonu ile NA olan veya olmayan verileri mantıksal operatörler ile görebiliriz. NA olan veriler TRUE, NA olmayan veriler ise FALSE olarak verilir. Bu fonksiyonu ayni zamanda matris ve vektörler üzerinde de uygulayabiliriz.

complete.cases(df_5) # eksik veri olan satirlar FALSE, olmayan satirlar icin TRUE degeri verdi
## [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE
# ayni fonksiyonu matris icin yapalim

df_7 <- as.matrix(df_5) # as.matrix ile data frame i matrix e donusturduk
class(df_7)
## [1] "matrix"
complete.cases(df_7)
## [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE
vektor <- as.vector(df_5$kimya_notu)
vektor
## [1] 65 93 NA 88 NA 95
class(vektor)
## [1] "numeric"
complete.cases(vektor)
## [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE

Data frame için hazırlamış olduğum çalışma bu kadar. İlgizin için teşekkür ederim. Önceki çalışmalarıma aşağıdaki linklerden ulaşabilirsiniz.

** Veri Görselleştirme **

https://tnchamza.wixsite.com/blog/home/r-ile-temel-veri-görselleştirme

** Vektörler **

https://tnchamza.wixsite.com/blog/home/r-ile-vektor-uygulamasi