R ile fonksiyonel programlama, tapply
Şimdi mtcars verisetinde yer alan mpg değişkeninin (yakıt sarfiyatının) motor türüne göre ortalamasını ayrı ayrı hesaplayalım. Ortalama mean() fonksiyonuyla hesaplanabilir. Şöyle bir kod işimizi görecektir:
mean(mtcars$mpg[mtcars$vs==0])
## [1] 16.61667
mean(mtcars$mpg[mtcars$vs==1])
## [1] 24.55714
mpg değişkeni yerine araçtaki karbürator sayısını gösteren carb değişkenini kullanacak olsaydık bu işlemi altı defa tekrarlamamız gerekecekti. Ancak tapply() fonksiyonuyla bu işlemi bir defada gerçekleştirmek mümkün:
tapply(mtcars$mpg,mtcars$vs,mean)
## 0 1
## 16.61667 24.55714
Bu değerleri yeni bir değişkene atayarak bir dizi (array) oluşturabiliriz:
mpg_by_vs <- tapply(mtcars$mpg,mtcars$vs,mean)
mpg_by_vs
## 0 1
## 16.61667 24.55714
tapply() fonksiyonu, fonksiyona giren birinci değişkeni, ikinci değişkene göre gruplara ayırmakta ve herbir gruba üçüncü parametre olarak verilen fonksiyonu uygulamaktadır. Görüldüğü gibi tapply() fonksiyonu bir skalar modunda bir dizi (array) oluşturmaktadır. Bazı hallerde liste modunda bir dizi elde etmek isteyebiliriz. Bunu simplify=FALSE parametresiyle yapabiliriz:
mpg_by_vs <- tapply(mtcars$mpg,mtcars$vs,mean, simplify = FALSE)
mpg_by_vs
## $`0`
## [1] 16.61667
##
## $`1`
## [1] 24.55714
tapply() fonksiyonu diğer istatistiksel fonksiyonlarla da kullanılabilir. Mesela, cbind() fonksiyonuyla skalar dizileri birleştirebilir ve liste yahut dataframe üretebiliriz:
cbind(tapply(mtcars$mpg,mtcars$vs,mean),
tapply(mtcars$mpg,mtcars$vs,sd),
tapply(mtcars$mpg,mtcars$vs,median))
## [,1] [,2] [,3]
## 0 16.61667 3.860699 15.65
## 1 24.55714 5.378978 22.80
Bu örnekte verisetinde bulunan araçların motor türüne göre yakıt performans değerlerinin ortalama, standart sapma ve medyen değerlerini tapply() fonksiyonuyla ayrı ayrı hesapladık ve cbind() fonksiyonuyla sütunlar halinde bir araya getirdik.