13 Temmuz 2014 Pazar

R İle Temel Uygulamalar

R ile temel uygulamalar için Medeniyet Üniversitesi Dr.Esra Akdeniz Duran'ın ders notları düzenlenmiştir

R nesneler ve fonksiyonlardan oluşur. Nesne bir ismi olan depolama alanı olarak görülebilir. Tüm veri, fonksiyon vs. bilgisayarın hafızasında isimli nesneler şeklinde depolanır.  Fonksiyonlar, bazı işlemleri gerçekleştirmek üzere tasarlanan özel R nesneleridir. Fonksiyonlara argümanlar(girdi) verilir ve fonksiyon bazı işlemleri gerçekleştirerek çıktı üretir. R’ın içinde birçok fonksiyon vardır ama kendi fonksiyonumuzu da yazabiliriz. 

R’da 5 tane nesne modu(türü) vardır:

Character(bazı programlarda string denir)(karakter, kelime vs.)

numeric(sayısal)

integer(tam sayı)

complex

logical(TRUE,FALSE,T,F)

R büyük küçük harflere duyarlıdır. True ile TRUE farklıdır.

Aşağıda nesneler bir tablo halinde verilmiştir.


boyut
Homojen(aynı tür veri)
Heterojen(farklı tür veri)
1(uzunluk)
Vector
List
2(satır,sütun)
Matrix
Data.frame
n
Array


Aşağıda yapılacak olan uygulamaları. R'da yeni bir R Markdown çalışma sayfası açarak birebir uygulamaya çalışalım.

File -> New File -> R Markdown yolu ile çalışma sayfası açılır

Vektörler

En basit (atomic) nesne vektördür ve aynı tür verileri(sadece sayısal, sadece karakter gibi) içerir. 1 boyutludur sadece uzunluğu vardır. List farklı nesne türlerini içerebilir (hem sayısal, hem karakter gibi)

Nesnelere içerikler  =  veya  <-  ile atanır.

=  ve  <-  atama operatörü denir. Bir sembole değer atarlar.

# işareti ve ondan sonra yazılanlar kod kısmında gözükür fakat çıktı da gözükmez. Bu işaret yardımıyla yazdığımız kodların yanına notlar alabiliriz.

Değişkene Değer Atama


> x=9   # x'e 9 değerini ata

> x     # Değer atanan x'i görüntüle


Yazılan kodları çalıştırmak için yazdığımız kod satırının sonuna gelip resimdeki siyah kutu içerisine alınmış Run butonuna tıklıyoruz. 




Kırmızı Kare: X değişkeni ve x değişkeninin değeri
Mavi Kare: Çıktı Ekranı

Nesnelerin içindeki veri türlerini öğrenmek için mode() veya class() fonksiyonu kullanılır.

Vektörleri oluşturmak için c() (concatenate) fonksiyonu kullanılır.



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


> mode(x)
[1] "numeric"

Bir vektörün türünü değiştirmek için as. kullanılır.

> as.character(x)
[1] "1" "2" "3"
> as.logical(x)
[1] TRUE TRUE TRUE
> as.complex(x)
[1] 1+0i 2+0i 3+0i
 
List farklı veri türleri içerebilir.

> x=list(1,"esra",T);

x


[[1]]
[1] 1

[[2]]
[1] "esra"

[[3]]
[1] TRUE

Boş vektör vector() ile olşturulur. Bir vektörün eleman sayısı length() fonksiyonu ile bulunur.

> g=c(1,4,5,2)
> length(g)
[1] 4
 
Tüm vektörler kayıp veri anlamına gelen NA içerebilir.

> u=c(4,5,NA,2)
> u
[1]  4  5 NA  2

> k=c(T,F,F,NA)
> k
[1]  TRUE FALSE FALSE    NA
 
Bir vektörün bir elemanına ulaşmak için o elemanın konumu [] içinde yazılır.

> k[2]  #k vektörünün ikinci elemanı
[1] FALSE
> u[1]
[1] 4
 
Bir vektörün herhangi bir elemanı aşağıdaki gibi değiştirilebilir.
> k[3]=T
> k
[1]  TRUE FALSE  TRUE    NA
 
Vektörler üzerinde çeşitli operasyonlar gerçekleştirilebilir.
> v=c(4,9,16)
> sqrt(v)   #karekök
[1] 2 3 4
> u=c(2,3,5) 
> u+v    #(aynı boyutlu vektörler toplanabilir)
[1]  6 12 21




Faktörler

Kategorik verilerle işlem yapmanın kolay bir yoludur. Faktörlerin grup sayısı kadar seviyesi(levels) vardır.

> g=c("f","m","m","f","m")   #karakter verileri
> g
[1] "f" "m" "m" "f" "m"
> g=factor(g)   #factor fonksiyonu ile sayısal veri gibi depolanıyor
> g
[1] f m m f m
Levels: f m     #sınıflar
 

table() fonksiyonu her bir sınıfın kaç elemanı olduğunu bulmamızı sağlar.

> table(g)
g
f m 
2 3 
 
> h=c("genc","genc","yasli","yasli","genc")
> table(g,h)
   h
g   genc yasli
  f    1     1
  m    2     1
 

marjinal toplamları da bulabiliriz.

> t=table(g,h)
> margin.table(t,1)  
g
f m 
2 3 
> margin.table(t,2)
h
 genc yasli 
    3     2 
 
Hem genel hem de marjinallere göre yüzdeleri elde etmek için:

> prop.table(t,1)    #satır yüzdesi
   h
g        genc     yasli
  f 0.5000000 0.5000000
  m 0.6666667 0.3333333
> prop.table(t,2)    #sütun yüzdesi
   h
g        genc     yasli
  f 0.3333333 0.5000000
  m 0.6666667 0.5000000
> prop.table(t)    #genel yüzde
   h
g   genc yasli
  f  0.2   0.2
  m  0.4   0.2

Seriler üretmek
:  işareti tamsayı serileri üretmek için kullanılır.
> x=1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> seq(1,10,1)
 [1]  1  2  3  4  5  6  7  8  9 10
> seq(1,10,2)
[1] 1 3 5 7 9
 
İstenilen sayılar arasında istediğimiz kadar sayı olan seri üretmek için
> seq(from=1,to=5,length=3)  #from=den to=e kadar anlamındadır
[1] 1 3 5
> seq(from=10,to=17,length=4)
[1] 10.00000 12.33333 14.66667 17.00000
 
-2’den başlayan 10 uzunluğunda 0.2’şerli ilerleyen sayı dizisinin oluşturulması. 
 
> seq(length=10,from=-2,by=0.2)
 [1] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2
 
rep() fonksiyonu ile istenilen verinin istendiği kadar tekrarı yapılır.
> rep(5,10)
 [1] 5 5 5 5 5 5 5 5 5 5
> rep("merhaba",3)
[1] "merhaba" "merhaba" "merhaba"
> rep(1:2,4)
[1] 1 2 1 2 1 2 1 2
 
gl() ile faktör serisi oluşturulur.  5’erli 3 sınıf oluşturmak için.
> gl(3,5)
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3

> gl(2,5,labels=c("kadin","erkek"))
 [1] kadin kadin kadin kadin kadin erkek erkek erkek erkek erkek
Levels: kadin erkek
 
Normal dağılımdan veri üretmek için:
> rnorm(10)   #standart normal dağılım
 [1]  0.1220183 -0.3048150 -0.3333319 -1.1727116  2.1739569  1.7564558
 [7] -0.2404292 -1.5084106  0.3845580  0.3609009
> rnorm(4,mean=10,sd=3)
[1] 11.219689 11.603210 11.551473  7.878923
 
10 serbestlik dereceli t dağılımından veri üretmek için
> rt(5,df=10)
[1] -1.05504777 -0.69100542  0.01466672  0.24766162 -1.06558358

Verinin alt kümesinin(subset) bulunması
X vektörünün 0’dan büyük elemanlarının alınması için

> x=c(0,-3,4,-1,45,90,-5)
> x>0
[1] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE
> x[x>0]
[1]  4 45 90
 
x vektörünün -2’den küçük veya eşit veya 5’ten büyük elemanlarını almak için  (| veya anlamındadır)
> x[x<=-2|x>5]
[1] -3 45 90 -5
 
x vektörünün 40’dan büyük ve 100’den küçük elemanlarını almak için  (& ve anlamındadır)
> x[x>40&x<100]
[1] 45 90
 
x vektörünün 4. ve 6. elemanlarını almak için
> x[c(4,6)]
[1] -1 90
 
veya
> y=c(4,6)
> x[y]
[1] -1 90
x’in ilk 3 elemanının almak için
> x[1:3]
[1]  0 -3  4
 
x vektörünün herhangi bir elemanını çıkarmak için – işareti ile eleman numarası girilir.
> x=c(0,-3,4,-1,45,90,-5)
> x[-1]
[1] -3  4 -1 45 90 -5
> x[-c(4,6)]
[1]  0 -3  4 45 -5
> x[-(1:3)]
[1] -1 45 90 -5
 
İsimli vektör oluşturmak için
> p=c(4.5,7,7.3,8.2,6.3)
> names(p)=c("isim1","isim2","isim3","isim4","isim5")
> p
isim1 isim2 isim3 isim4 isim5 
  4.5   7.0   7.3   8.2   6.3 
> 
> p=c(isim1=4.5,isim2=7,isim3=7.3,isim4=8.2,isim5=6.3)
> p
isim1 isim2 isim3 isim4 isim5 
  4.5   7.0   7.3   8.2   6.3 
> p["isim3"]
isim3 
  7.3 

Matrisler ve Array (Seri)’ler
Veriler 1’den çok boyutlu nesnelerde de saklanabilir. Matrisler iki boyutlu verileri saklarken Arrayler daha çok boyuttaki verileri saklayabilir.  Matrisler ve Array’ler aynı tür veriler içerirler.
> matrix(1:6,2,3)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> mode(matrix(1:6,2,3))
[1] "numeric"
> matrix(c("a","b","c","d","e","f"),2,3)
     [,1] [,2] [,3]
[1,] "a"  "c"  "e" 
[2,] "b"  "d"  "f" 
> mode(matrix(c("a","b","c","d","e","f"),2,3))
[1] "character"

> m
     [,1] [,2] [,3] [,4]
[1,]   45   12   56   34
[2,]   23   32   87   21
> t(m)##matirisin transpozu
     [,1] [,2]
[1,]   45   23
[2,]   12   32
[3,]   56   87
[4,]   34   21

Bir vektör matrise dönüştürülebilir.

> m=c(45,23,12,32,56,87,34,21)
> dim(m)=c(2,4)
> m
     [,1] [,2] [,3] [,4]
[1,]   45   12   56   34
[2,]   23   32   87   21
 
Matrisler sütun sütun oluşturulur, satırların önce oluşturulması için
> matrix(1:6,2,3)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> matrix(1:6,2,3, byrow=T)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
 
Matrisin herhangi bir elemanını çekmek için: Burada 2. Satırın 3. Elemanı çekilmiştir.
> m[2,3]
[1] 87
 
2. satırı çıkar 1. sütunu al.
> m[-2,1]
[1] 45
 
Önceki bölümde anlatılan alt küme oluşturma işlemleri matrisler için de yapılabilir.
> m[1,-c(3,5)]
[1] 45 12 34
 
Matrisin boyutlarını öğrenmek için dim() fonksiyonu kullanılır.
> mat=matrix(1:6,2,3)
> dim(mat)
[1] 2 3
 
İkinci bir boyut belirtilmezse satırların veya sütunların tamamı alınır.
> m[1,]    #1. satır
[1] 45 12 56 34
> m[,4]    #4. sütun
[1] 34 21
 
Sütunları birleştirmek için cbind() satırları birleştirmek için rbind() fonksiyonları kullanılır.
> cbind(c(2,4),c(3,5))
     [,1] [,2]
[1,]    2    3
[2,]    4    5
> rbind(c(2,4),c(3,5))
     [,1] [,2]
[1,]    2    4
[2,]    3    5
 
Vektörlerde olduğu gibi matrisin de satır ve sütunarına isim verilebilir.
> mat=matrix(c(10,30,24,32,21,25),2,3,byrow=T)
> colnames(mat)=c("a","b","c")
> rownames(mat)=c("satir1","satir2")
> mat
        a  b  c
satir1 10 30 24
satir2 32 21 25
 
Arrayler matrislerin 2’den çok boyuta genişletilmesidir.
> a=array(1:24,dim=c(4,3,2))
> a
, , 1
 
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
 
, , 2
 
     [,1] [,2] [,3]
[1,]   13   17   21
[2,]   14   18   22
[3,]   15   19   23
[4,]   16   20   24
 
Array’in alt kümelerini çekmek için matristeki benzer işlemler yapılır.
> a[1,3,2]
[1] 21
> a[4,3,]
[1] 12 24

Liste (list)

Liste farklı türde veriler içerebilir.
> listem=list(no=112345,ad="Esra",soyad="Akdeniz Duran",notlar=c(55,65,90))
> listem
$no
[1] 112345
 
$ad
[1] "Esra"
 
$soyad
[1] "Akdeniz Duran"
 
$notlar
[1] 55 65 90
 
Listenin elemanlarını görüntülemek için [[]] kullanılır.
> listem[[1]]
[1] 112345
 
Tek parantezli girseydik başka bir çıktı alırdık.
> listem[1]
$no
[1] 112345
 
 
Başka bir yol:
> listem$no
[1] 112345
 
Listenin elemanlarının türlerini görmek için
> mode(listem[[1]])
[1] "numeric"
> mode(listem[[2]])
[1] "character"
 
Listenin elemanlarının isimlerini görmek için:
> names(listem)
[1] "no"     "ad"     "soyad"  "notlar"
 
Listeye yeni elemanlar eklenebilir:
> listem$okul.adi=c("Marmara")
> listem
$no
[1] 112345
 
$ad
[1] "Esra"
 
$soyad
[1] "Akdeniz Duran"
 
$notlar
[1] 55 65 90
 
$okul.adi
[1] "Marmara"
 
Listenin uzunluğu
> length(listem)
[1] 5
 
unlist() fonksiyonu ile listedeki her bir elemanın ayrılması sağlanır.
> unlist(listem)
             no              ad           soyad         notlar1         notlar2 
       "112345"          "Esra" "Akdeniz Duran"            "55"            "65" 
        notlar3        okul.adi 
           "90"       "Marmara" 
 
Görüldüğü gibi notların her biri bir eleman olarak ayrılmıştır.

Data Frame (Veri tablosu)        

Çeşitli veri türlerini içerebilen matristir.
> verisetim=data.frame(cinsiyet=c("F","M","F","F","M"),mevsim=c("Yaz","Kis","Bahar","Yaz","Sonbahar"),
+                      boy=c(167,186,168,175,190))
> verisetim
  cinsiyet   mevsim boy
1        F      Yaz 167
2        M      Kis 186
3        F    Bahar 168
4        F      Yaz 175
5        M Sonbahar 190
Data.frame karakter verilerini otomatik olarak faktör yapar.
> verisetim[3,2]
[1] Bahar
Levels: Bahar Kis Sonbahar Yaz
> verisetim$boy
[1] 167 186 168 175 190
 
Sadece boyu 170cm’den uzun olan verileri almak için:
> verisetim[verisetim$boy>170,]
  cinsiyet   mevsim boy
2        M      Kis 186
4        F      Yaz 175
5        M Sonbahar 190
 
Cinsiyeti erkek olanların boylarını almak için
> verisetim[verisetim$cinsiyet=="M","boy"]
[1] 186 190
 
Cinsiyeti erkek olanların boylarını  ve mevsim değişkenini almak için
> verisetim[verisetim$cinsiyet=="M",c("boy","mevsim")]
  boy   mevsim
2 186      Kis
5 190 Sonbahar
 
attach() fonksiyonu ile data.frame’in her bir elemanı ayrı olarak algılanır.
> attach(verisetim)
> boy
[1] 167 186 168 175 190
 
detach() ile bu özellik geri alınır ve artık sütunlar ayrı veri olarak algılanmaz. .
> detach(verisetim)
> boy
Error: object 'boy' not found   #boy bulunamadı
 
subset() fonksiyonu ile veri setinin alt kümesi kolaylıkla bulunabilir.
> subset(verisetim,boy>170)
  cinsiyet   mevsim boy
2        M      Kis 186
4        F      Yaz 175
5        M Sonbahar 190

> subset(verisetim,mevsim=="Yaz", c(boy,cinsiyet))
  boy cinsiyet
1 167        F
4 175        F
 
Veri setine yeni bir sütun eklemek için
> verisetim$kilo=c(65,75,89,78,93)
> verisetim
  cinsiyet   mevsim boy kilo
1        F      Yaz 167   65
2        M      Kis 186   75
3        F    Bahar 168   89
4        F      Yaz 175   78
5        M Sonbahar 190   93
 
Data.frame’in satır ve sütun sayısını bulmak için
> ncol(verisetim)
[1] 4
> nrow(verisetim)
[1] 5

R’daki veri setleri genellikle data.frame şeklindedir.  R’ın içinde bir süre veri seti mevcuttur bunları görüntülemek için data()  fonksiyonu kullanılabilir.
Örnek olarak
> data(USArrests)
 USArrests adında bir veri seti R’a çağrılır. 


Fonksiyonlar

R’da istenilen fonksiyonlar kolaylıkla yazılabilir.  Örnek olarak ortalamanın standart hatası sıklıkla ihtiyaç duyulan bir değerdir. Formülü  
   
Bu değeri hesaplamak için sh adında bir fonksiyon oluşturalım. Önce R’ın hafızasında böyle bir fonksiyon olup olmadığı kontrol edilmelidir.
> sh
Error: object 'sh' not found

> sh=function(x){
+ v=var(x)
+ n=length(x)
+ return(v/n)
+ }
 
Fonksiyon   function(<girdi parametreleri>){<R komutları>} biçiminde oluşturulur.
> sh(c(45,3,5,6,7,8,21))
[1] 32.37415
şeklinde fonksiyon çalıştırılır.
Bir x vektörü için basit istatistikleri hesaplayan bir program yazalım.
basic.stats=function(x,daha=F){
  stats=list()  #bos bir liste olusturulur
x_tam=x[!is.na(x)]  #kayip veriler x'den cikarildi
stats$n=length(x)
stats$nkayip=stats$n-length(x_tam)
stats$ortalama=mean(x_tam)
stats$standartsapma=sd(x_tam)
stats$medyan=median(x_tam)
if (daha){
  stats$carpiklik=sum(((x_tam-stats$ortalama)/stats$standartsapma)^3)/length(x_tam)
  stats$basiklik=sum(((x_tam-stats$ortalama)/stats$standartsapma)^4)/length(x_tam)-3
}
unlist(stats) 
}
Burada daha girdisi F olarak belirlenmiştir. T olursa son iki istatistik olan basıklık ve çarpıklığı da hesaplar.
Fonksiyon aşağıdaki gibi kullanılabilir.
> basic.stats(c(-3,5,56,77,1,NA,89))
            n        nkayip      ortalama standartsapma        medyan
      7.00000       1.00000      37.50000      41.43308      30.50000
> basic.stats(c(-3,5,56,77,1,NA,89),daha=T)
            n        nkayip      ortalama standartsapma        medyan     carpiklik      basiklik
    7.0000000     1.0000000    37.5000000    41.4330786    30.5000000     0.1292667    -2.1422567

Virgülden sonra sadece 3 basamağın görüntülenmesi için  options(digits=3) fonksiyonu kullanılır.

> options(digits=3)
> basic.stats(c(-3,5,56,77,1,NA,89))
            n        nkayip      ortalama standartsapma        medyan
          7.0           1.0          37.5          41.4          30.5
> basic.stats(c(-3,5,56,77,1,NA,89),daha=T)
            n        nkayip      ortalama standartsapma        medyan     carpiklik      basiklik
        7.000         1.000        37.500        41.433        30.500         0.129        -2.142
> f=function(x){
+   for (i in 1:10){
+     res=x*i
+     cat(x,'*',i,'=',res,'\n')
+   }
+ }
> f(5)
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
5 * 10 = 50 

Hiç yorum yok:

Yorum Gönder