Hangi apply fonksiyonunu, nasıl kullanırız?
Bir önceki yazıda tapply() fonksiyonunun kullanımına ilişkin örnekler sunmuştum. Aslında R’da apply fonksiyonları olarak adlandırılan başka fonksiyonlar da bulunmakta. Bunların yaptığı iş hemen hemen tapply() fonksiyonuna benzer olmakla birlikte genellikle girdi ve çıktıları farklılık göstermektedir.
Şimdi kısaca bunları tanıtayım:
apply()fonksiyonu matrix tipi verilerde kullanışlıdır:
M <- matrix(sample(1:100,16,replace = TRUE), nrow = 4, ncol = 4)
apply(M, 1, sum)
## [1] 270 217 265 262
apply(M, 2, sum)
## [1] 251 308 253 202
apply(M,c(1,2),sqrt)
## [,1] [,2] [,3] [,4]
## [1,] 7.141428 7.810250 8.124038 9.591663
## [2,] 7.000000 7.681146 9.746794 3.741657
## [3,] 8.831761 9.848858 4.358899 8.426150
## [4,] 8.544004 9.539392 8.544004 5.000000
Bu örnekte M adını verdiğimiz 4 satır ve sütundan oluşan bir matrix oluşturduk. Matriksin içini sample() fonksiyonunu kullanarak rastgele verilerle doldurduk. Daha sonra apply() fonksiyonunu kullanarak önce satırların sonra sütunların toplamlarını hesapladık.
Son işlemdeyse sqrt() fonksiyonuyla matrikste bulunan bütün değerlerin karekökünü hesapladık. Dikkat ederseniz burada satır ve sütunları c(1,2) şeklinde bir vektör ile ifade ettik.
lapply()fonksiyonu liste türü verilerde kullanılır ve fonksiyonun çıktısı da yine bir liste şeklinde olur:
alist <- list(A=sample(1:30,10),
B=c("a","b","c","d","e"),
C=c("şu","köşe","yaz","köşesi"))
lapply(alist,FUN=length)
## $A
## [1] 10
##
## $B
## [1] 5
##
## $C
## [1] 4
lapply(alist,FUN=mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## $A
## [1] 13.2
##
## $B
## [1] NA
##
## $C
## [1] NA
Bu örnekte ilki numerik, ikincisi karakter ve üçüncüsü string şeklinde üç eleman içeren bir liste oluşturduk ve lapply() fonksiyonu ile listedeki herbir ögenin kaç eleman içerdiğini sorguladık. Görüldüğü gibi fonksiyonun çıktısı da liste şeklinde oldu.
lapply() fonksiyonunu ikinci kullanımımızda sadece numerik değerler üzerinde çalışabilecek ortalama yani mean() fonksiyonunu kulandık. Listenin ilk ögesinin ortalaması hesaplanırken, iki ve üçüncü ögeler hesaplanamamış ve çıktının sonunda ortalama fonksiyonunun numerik olmayan değerlere uygulanamayacağına ilişkin hata mesajı görüntülenmiştir.
sapply()fonksiyonunu da liste türü verilere uygulanır ancak çıktı tipi vektördür. Örnek olarak az önce oluşturduğumuz alist isimli listenin elemanlarının uzunluğunu bu sefer sapply() fonksiyonuyla hesaplayalım:
sapply(alist,FUN=length)
## A B C
## 10 5 4
sapply(alist,FUN=mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## A B C
## 13.2 NA NA
vapply()fonksiyonusapply()gibi girdi olarak liste tipi verileri almakta ve çıktısı ise vektör tipi veriler olmaktadır.vapply()fonksiyonunun farkı, istenilen işlemi daha hızlı gerçekleştirmesidir. Büyük verisetleri üzerinde çalışmamız durumudavapply()fonksiyonu yazdığımız koda hız katabilir.mapply()fonksiyonununun farklı yanı, istenilen işlemi veri yapılarının ilk önce birinci sıradaki elemanlara, sonra ikinci, sonra üçüncü olmak üzere bütün elemanlarına sırasıyla uygulamasıdır. Bunu bir örnekle daha iyi anlayabiliriz:
mapply(sum,10:20,100:110,1000:1010)
## [1] 1110 1113 1116 1119 1122 1125 1128 1131 1134 1137 1140
Bu örnekte mapply() fonksiyonu içerisinde üç farklı veri yapısı tanımlanmakta ve bunlar üzerinde toplama işlemi yapılması istenmektedir. İlk işlem 10+100+1000=1110, ikinci işlem 11+101+1001=1113, üçüncü işlem 12+102+1002=1116 olarak yapılmaktadır. Toplama işlemi bu şekilde sırasıyla herbir dizinin bütün sayılarına uygulanmıştır.
- Bir önceki yazıda incelediğimiz
tapply()fonksiyonu bir vektörün alt grupları üzerinde işlem yapmamızı sağlar. Bu alt gruplar da genellikle bir faktör tarafından belirlenir. Hatırlayacak olursak buna örnek olarakmtcarsverisetinde farklı motor tipine sahip iki araç grubunun yakıt sarfiyatı üzerinde işlem yapmıştık:
tapply(mtcars$mpg,mtcars$vs,mean)
## 0 1
## 16.61667 24.55714
mapply()fonksiyonu, kullanıcı tarafından tanımlanan özel bir fonksiyonun bir listede bulunan veri tiplerinin tamamına sırayla uygulanmasını sağlar.
Daha fazla bilgi için burada verilen fonksiyonların yardım dosyalarına ve bu yazıyı hazırlarken de faydalandığım R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate başlıklı stackoverflow girdisine göz atılabilir.