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 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.
= 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
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
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
|
|||||
|
> 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