1) Ogrenme Gunlugu (17.12.2025)

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ı…

2) Öğrenme Günlüğü Kapsamında Örnek Denemelerim

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

  1. İlk denemem kapsamında apply kullandım. Bu kapsamda ilk olarak bir matris ataması yapmış olmakla birlikte ardından, 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
  1. Ardından hem fonksiyonlu hem de mapplylı bir yapı kurmaya çalıştım. Süreçte ilk öncelikle vize-final puanlarıyla birlikte ortalama bir değer almaya çalıştım. Bunun için 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
  1. Son olarak, bir de dışarıdan fonksiyon atamalı bir sistem denemiş bulunmaktayım. Bu kapsamda 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