Kötü Şöhretli Apply Fonksiyonu

R’ye yeni başlayanlar apply() fonksiyonunu programlamada mutluluğa açılan çok güçlü ama ulaşılamayacak gizli bir kapı gibi görür. Burada yeni başlayanlara apply() fonksiyonun asıl gücünü nasıl kullanılacağına ilişkin örnekler vererek yardımcı olacağım. İşte R programlamayı eğlenceli ve kullanışlı hale getirmeye yardımcı olabilecek apply() fonksiyonunu kullanmanın bazı harika yolları.

İlk olarak, Apply () fonksiyonun genel yapısı şöyledir:


     apply(x, MARGIN, FUN)

1.  İlk bağımsız değişken “x”, bir şeyler yapmak istediğiniz veri kümesi veya sütunlardır.

2.  İkinci bağımsız değişken “MARGIN” fonksiyonu nasıl uygulamak istediğinizdir. Seçenekler satırlar (MARGIN=1) veya sütunlar (MARGIN=2) üzerindedir.

3.  Üçüncü bağımsız değişken (FUN) uyguladığınız fonksiyondur.

Mesela basit bir örnekle, “mydata” adlı veri setinizin tüm sütunlardaki değerleri toplamak istiyorsunuz. Bu yolla yapabilirsiniz:

apply(mydata, 2, sum)

Ama bu her zaman çok kullanışlı değildir. Veri setimizde başka sütunlarımız da var ve muhtemelen her zaman toplamak istemiyoruz.  Peki başka ne yapabiliriz? İşte apply() kullanmanın iki güzel yolu:

  1. Belirli bir koşulu karşılayan kaç sütun olduğunu sayma

“births” adlı bir veri setinde 13 çocuk sonucum var ve kaç tane canlı doğum olduğunu saymak istiyorum. Benim “birth” verilerim şuna benziyor:

Canlı doğumları, özellikle oradaki sinir bozucu NA’larla nasıl ekleyebilirim?

İşte bunu tek satırla yapmanın yolu:

births$childcount<-apply(births[,1:5], MARGIN=1, function(x) {sum(x==”live birth”, na.rm=TRUE)})

Kod bize, “births” veri setimdeki ilk 5 sütunun her bir satırı için(MARGIN=1) appply fonkisyonunu uygulayın diyor. Fonksiyon x’i girdi olarak alır (x sadece births [, 1: 5] veri kümesidir),  ve bu veri kümesinin her sütunu için “canlı doğum” sayısının kaç tane olduğunu özetler. Na.rm seçeneği herhangi bir NA’yı dikkate almaz. Başka koşullarınız varsa örneğin 2010’dan sonra kaç yıl olduğunuzu saymak istiyorsanız function(x) {sum(x>2010, na.rm=TRUE)}) diyebilirsiniz.

2.     Bir defada birden çok sütun için kodlanmış eksik değerleri NA olarak değiştirme

Genellikle veri kümeleri, eksik değerlerini boş bırakmak yerine 99 veya -99 olarak kodlar. Verilerle daha iyi çalışabilmemiz için bunları eksik değer olarak değiştirmek isteyebiliriz. Bir kerede bir değişken için bunu ifelse() fonksiyonu ile yapabilirsiniz:

originaldata$variable1<-ifelse(originaldata$variable1==99 | originaldata$variable1==-99, NA, originalvariable1)

       Bu, birinci bağımsız değişkenin koşulu değerlendirdiği Stata’daki cond() komutuna eşdeğerdir; ikinci bağımsız değişken koşul doğruysa yapılır, üçüncü bağımsız değişken ise koşul yanlışsa yapılır.

 Ancak bunu yapmak istediğim 3 veya 30 sütunum varsa ne olur?  Hepsi için ayrı ayrı ifelse() komutu yazmak zorunda değilim. Onun yerine apply() komutunu kullanıyorum.

Burada “originaldata” adlı veri setim ve 4 tane orijinal kayıp değerden NA değerine çevirmek istediğim 4 değişkenim var. Bu değişkenlerin sütun numaraları 2,4,5, ve 6. Aşağıdaki gibi:

Orijinal veri kümesinin sütunlarını alıyorum ve bu sütunların her biri için girdinin değerini kontrol etmek üzere bir ifelse fonksiyonu kullanıyorum. Eğer girdi 99 veya -99 ise NA olarak değiştiriyorum değilse de olduğu gibi bırakıyorum. Bu sadece benim seçtiğim sütunlarla “new data” adlı yeni veri setini oluşturur.

newdata<-apply(originaldata[,c(2,4:6)], MARGIN=2, function(x) {ifelse(x==99 | x==-99, NA,x)})

“new data”yı yazdırıyoruz:

Şimdi, orijinal veri kümesini değiştirilen değişkenlerle birlikte istiyorsak, bunları cbind (sütun bağlama) ile bir araya getirebiliriz:

alldata<-cbind(originaldata[, c(-2,-4:-6)], newdata)

Ekstra havalı olmasını istiyorsan cbind() komutu ile apply() komutunu şu şekilde birleştirebilirsiniz.

newdata<-cbind(originaldata[,c(-2,-4,-6)], apply(originaldata[,c(2,4:6)], MARGIN=2, function(x) {ifelse(x==99 | x==-99, NA,x)}))

Kaynak: https://www.r-bloggers.com/2012/09/the-infamous-apply-function/