Bu hafta kapsamında apply ailesine değinmiş olmakla
birlikte pek çok analiz sürecini hızlandıracak bir yapısı olduğunu
aldım. Bu kapsamda öncelikle lapply ilk olarak nesnemizin
bir vektör olup olmadığın kontrol ettiğini ve vektör yapısı varsa
listeye çevirerek bizim atadığımız fonksiyonu uygulayan bir yapısı
olduğunu söyleyebilirim. Derste işlediğimiz örneklerem baktığımda ise
bizler veri setini atadıktan sonra
lapply(setadı, yapılacak fonksiyon, fonksiyonun diğer argümanları)
sistematiğini kurulması gerektiğini anladım. Örneğin,
lapply(set1, sd) yapısını verebilirim. Bu tarz bir yapıyı
kurduğum da ise set kapsamında atadığım her bir listeye yönelik standart
sapma hesaplaması yaptığını gördüm. Bunun yanı sıra, runif
temelli bir şekilde lapply temelli bir analiz yapmış
bulunmaktayız. Burada ilk liste yapısı atarken x<-1:4
tarzı bir ifade atadığımızda satırlarda sırasıyla 1,2,3,4 veri
ürettiğini gözlemledim (runif tek düze dağılım sunar). Bunun ise temel
nedenin lapply fonksiyonunun her bir atamayı tek tek
değerlendirmesi olarak düşündüm.
Benim aklımı derste en çok karıştıran noktalardan birisi
lapply(1:3,runif,min=1:3,max=10:12) fonksiyonu olmuştu.
Tekrardan şimdi üstüne düşündüğümde minimum ve maksimum arası sırasıyla
1-10,2-11,3-12 arası bir eşleştirme yaparak sonuç verdiğini gözlemledim.
Ciddi ciddi bu kısmı bir 10 dakika kadar sorguladım ve sonunda mantığını
anlamak beni mutlu etti. Ayrıca yukarıda hep liste üzerinden bir sistem
kurulduğunu ifade etmiştim ama matrislerde de bu sistematiğin
kurulduğunu fark ettim.
Matrisler üzerinde gerçekleştirdiğimiz örneklerde en çok ilgimi çeken
isimsiz fonksiyon tanımlaması yapmak yani lapply içerisine
fonksiyon ataması yapılması gerektiğini anladım. Yaptığımız öröneklerde
matrisleri yine list içerisinde atamanın önemli bir yapı olduğunu
düşündüm. Örneğin list(m1=matrix(runif(10,5,10),2,5)
yapısıyla matris atamasını gerçekleştirip ardından lapply
yapılabilir. Ardından ise isimsiz fonksiyonu ise
lapply(listeadı, function(a){a[,1]*a[,5]}) benzeri bir yapı
kullanabilirmişiz. Bu kısımda kendi yaptığım denemelerde klasik bir
fonksiyonu kurup bunu değişken gibi lapply içine atmanın ise daha rahat
olduğunu anladım.
lapply ile ilgili öğrendiğim değişik bilgi ise
colMeans fonksiyonunun lapply içerisinde
doğrudan kullanılamadığı oldu. Bu kapsamda ilk öncelikle
function(x){colMeans(x(c("","")} benzeri bir yapıyla
birlikte boş fonksiyon ataması temelli bir sistematik kurulması
gerektiğini anladım.
Bunun yanı sıra, sapply fonksiyonuna bakıldığında ise
lapply ile benzer yapının oluştuğunu gözlemledim. Bunun lapply göre
farkının ise daha temiz bir şekilde düz bir şekilde(satır halinde) sonuç
verdiğini gözlemledim. Ayrıca, dataframe ile oluşturan
setlerde de bunun kullanımının önemli olduğunu düşündüm.
split() fonksiyonuna da değinmiş bulunmaktayız. Bunu ele
alırken
gl(sayı1(kategori sayısı),sayı2(kategorideki eleman sayısı))
ile faktör üretme yapısının oluşturulduğunu öğrendim. Bunun tabii
öncesinde önceden kaçar veri olacağıda atanmalıdır.
split fonksiyonunun temel yapısında eksik verininin
kullanılmaması gerektiğini anlamakla birlikte sapply veya lapply ile de
uygulanabilir bir yapısı olduğunu düşündüm. Örneğimizi incelediğimde ise
lapply öncesinde split(setadı, setadı$değişkenadı)
yapısıyla birlikte bölümün yapılmasının ardından
lapply(splitliatamanınadı, function(){}) benzeri bir
yapıyla birlikte gruplara bölünmüş temelli şekilde analiz
yapabileceğimizi anladım.
tapply fonksiyonuda groupby ile aynı yapıyı
gerçekleştiren bir yapı olarak ifade edilebilir. Bu kapsamda genelde
kategorik verilerle çalışılabileceğini ya da faktör atamasıyla birlikte
yine bu fonksiyonu kullanabileceğimizi anladım. Temel yapısını ise
tapply(setadı$işlem yapılacak sütun,setadı$gruplamanınyapılacağısütun, yapılacak işlem)
şeklinde ifade edebilirim. Ayrıca bu fonksiyonun sadece vektörlerde de
kullanabildiğini ifade edebilirim. Buna benzer olarak by
fonksiyonuyla da aynı işlemi gerçekleştirebiliriz. Fonksiyon yapısını
by(setadı$işlem yapılacak sütun,setadı$gruplamanınyapılacağısütun, yapılacak işlem)
şeklinde ifade edebilirim. Ayrıca bu iki yapıda da
sort,decreasing=T/F gibi argümanlarıda
kullanabileceğimizi söyleyebilirim.
apply() fonksiyonunda ise satır ve sütun için ayrı ayrı
işlemler yapmaya yönelik olarak bir sistematik olduğunu anladım.
Baktığımızda apply(x,1/2,işlem) sistematiğinin olduğunu
burada 1’in satır, 2’nin sütun yapısını temsil ettiğini
söyleyebilirim.
Bunun ardından bağıl değişkenlik katsayısına değinmiş bulunmaktayım.
Bu yapıyı yüksek lisansta görmemize rağmen unuttuğum için üzüldüm.
Yüksek lisans derslerimi tekrar etmem gerektiğini anladım. Bunun
oluşturulmasında ise,
bagildeg<-funciton(dagilim){(sd(dagilim)/mean(dagilim)*100}`
kullanılabileceğini öğrendim. Ayrıca, burada standart sapmanın bu
katsayıyı etkilediğini de hatırlamış bulunmaktayım.
mapply()’da net şekilde bir fikrim olmadığını
söyleyebilirim. rep li yapıların girmesi aklımı karıştırdı.
Bu konuya biraz daha çalışmayı düşünüyorum. Birden çok veri setini tek
satırda oluşturma durumu çok hoşuma gitti.
mapply(rnorm,100,c(),c() yapısını örnek verebilirim. Ayrıca
bunda, moreARgs yapısıyla birlikte de ek atama
yapabileceğimizi öğrendim. Buna bağlı olarakta vectorize
kısmını da anlamlandıramadım…
R’ım da nereye bastığımı bilmiyorum ama yazdıklarımın yanına bir şey yazmaya çalıştığımda önceki yazdıklarımı siliyor. Bunu nasıl çözeceğimi bilemedim. Takıldı kaldı…
Öncelikle bu kısım kapsamında zor örnekler tercih etmedim. Temel mantığı oturtabilmek açısından kolay örneklerle kod yapısını oturtmaya çalıştım.
apply(setadı,1/2,işlem) yapısını kullandım. İlk apply
kapsamında satır bazında ortalamayı ele almaya çalıştım. İkincisinde ise
sütun bazında standart sapma hesaplaması yapmaya çalıştım.puan <- matrix(c(45,20,60,
75,35,50,
66,78,52),
nrow = 3, byrow = TRUE)
apply(puan, 1, mean)
## [1] 41.66667 53.33333 65.33333
apply(puan, 2, sd)
## [1] 15.394804 30.105371 5.291503
2-3) İkinci denemem kapsamında lapply ’ı çalıştırmayı
denedim. Bu kapsamda bir liste şeklinde veri oluşturmaya çalıştırdım.
Ardından lapply(setadı,işlem) yapısını kullanarak veri
setine yönelik ortalama hesapladım. Ayrıca, sonrasında notlarımı
okuduğumda sapply ve lapply kullanımlarının
benzer olduğunu tekrardan hatırlayarak sapply(setadı,işlem)
yapısını aktardım.
veri <- list(
sinif1 = c(65, 77, 84),
sinif2 = c(72, 64, 46),
sinif3 = c(50, 65, 70)
)
lapply(veri, mean)
## $sinif1
## [1] 75.33333
##
## $sinif2
## [1] 60.66667
##
## $sinif3
## [1] 61.66667
sapply(veri, mean)
## sinif1 sinif2 sinif3
## 75.33333 60.66667 61.66667
4-5) Bu kapsmda ise split fonksiyonunu denedim. Süreçte
baktığımda ilk olarak data.frame() fonksiyonuyla birlikte,
6 öğrenciye yönelik grup (A,B,C) ve puan değişkeni atamış bulunmaktayım.
Ardından ise
split(setadı$elealınacakdeğişken, setadı$gruplamadeğişkeni)
yapısını kullanarak A,B,C şubelerine yönelik puanları ayrı ayrı
görüntüledim. Ardından bu yapının tapply ile de uyumlu
olduğunu görüp doğrudan splitte yaptığım fonksiyonu aktarıp, yapılacak
bir işlem olarak mean ataması yaptım.
sets <- data.frame(
ogrenci = 1:6,
grup = c("A","A","B","B","C","C"),
puan = c(65,77,78,89,90,55)
)
split(sets$puan, sets$grup)
## $A
## [1] 65 77
##
## $B
## [1] 78 89
##
## $C
## [1] 90 55
tapply(sets$puan, sets$grup, mean)
## A B C
## 71.0 83.5 72.5
function(x,y){işlem} yapısından
yararlandım. Ardından vize ve finale yönelik puan ataması yapmış olmakla
birlikte mapply(işlem,değişken1,değişken2) ataması yaparak
üç kişiye yönelik ortalama saptaması yaptım.ortalama <- function(vize, final){
0.4*vize + 0.6*final
}
vize <- c(60, 70, 80)
final <- c(70, 80, 90)
mapply(ortalama, vize, final)
## [1] 66 76 86
lapply tercih etmiş olmakla
birlikte ilk liste ataması yapıp ardından function
içerisinde ortalama, standart sapma değeri ataması yaptım ve
lapply(setadı,işlem) yapısını kullandım.puans<- list(
A = c(60, 70, 80),
B = c(75, 85, 90),
C = c(50, 65, 70)
)
ozet <- function(x){
c(Ortalama = mean(x), SS = sd(x))
}
lapply(puans, ozet)
## $A
## Ortalama SS
## 70 10
##
## $B
## Ortalama SS
## 83.333333 7.637626
##
## $C
## Ortalama SS
## 61.66667 10.40833