Daha önceki yazılarımızda, dplyr paketi ile veri manipülasyonundan ve paket içindeki mutate fonksiyonundan bahsetmiştik. Bu yazımızda ise veri
setinin çeşilti sütunlarını tek seferde dönüştürebildiğimiz mutate_all(), mutate_if() ve mutate_at() fonksiyonları üzerinde duracağız.
- mutate_all(): tüm sütunlarda dönüşüm
- mutate_at(): dplyr::select mantığında seçilen sütunlarda dönüşüm
- mutate_if(): ilgili koşul altında TRUE dönen sütunlarda dönüşüm
Öncelikle dply paketinin kurulumunu yapıp (kurulu değilse) ardından paketi aktif hale getirelim.
install.packages("dplyr")
library(dplyr)
Fonksiyon örneklerine geçmeden önce üzerinde çalışacağımız örnek bir veri seti yaratalım. rnorm fonksiyonu ile normal dağılımda rastgele sayılar üreterek sütunları doldurabiliriz. seq.Date ile tarih sütunu oluşturarak farklı değişken tipinde sütunlardan oluşan bir veri seti yaratmış olacağız.
sample_data <- data.frame(Date=seq.Date(as.Date("2017-01-01"),
by="day",
length.out = 100),
replicate(10,rnorm(100)),
Y1=rnorm(100))
sample_data %>% head()
## Date X1 X2 X3 X4 X5
## 1 2017-01-01 1.8242832 -1.4376655 -1.3588612 -1.1318090 1.32933526
## 2 2017-01-02 0.1641156 -0.9434183 -0.1070969 -0.4374821 -0.77045158
## 3 2017-01-03 1.7237424 0.7456074 1.4066528 0.2191078 -0.22199642
## 4 2017-01-04 -0.2051364 0.3117958 -0.9597379 1.3868229 0.68152124
## 5 2017-01-05 1.5776689 -0.5765459 -0.2755525 -2.0917390 -1.37217754
## 6 2017-01-06 -0.9799229 0.2176186 -0.3763447 0.5101492 0.06304734
##
## X6 X7 X8 X9 X10 Y1
## 1 -0.2956806 0.7859956 -0.7462034 -0.73875741 -2.23390662 -0.9693461
## 2 0.8532578 -0.3342933 0.1927040 0.59362355 -0.29593896 -0.9424424
## 3 2.7216834 0.9526902 1.4782167 -0.55754674 1.94509083 0.6128608
## 4 -0.7779871 0.2063144 0.1600183 -0.43317206 -0.03924392 0.2816300
## 5 1.5117212 1.2359881 -1.5050404 -0.07915567 -1.65858911 0.3473430
## 6 -0.6119805 -0.6690024 -1.3431034 -0.77049131 -0.64266173 -0.3861555
mutate_all
mutate_all fonksiyonu ile tüm sütunlara funs argümanı içinde belirlenen dönüşüm fonksiyonu uygulanır. mutate_all ile çalışırken
dönüşüm fonksiyonunun tüm değişken(sütun) tipleri için uygulanabilir olup olmadığına dikkat etmemiz gerekir.
Örnek veri setinin her sütununu tarayarak 0’dan küçük değerlere NA yerleştirelim. Bu dönüşümü sağlamak için replace fonksiyonunu kullanabiliriz.
sample_data %>%
mutate_all(funs(replace(., .< 0, NA))) %>%
head()
## Date X1 X2 X3 X4 X5 X6
## 1 2017-01-01 0.08139727 NA NA 1.399025 1.138946 1.6755233
## 2 2017-01-02 NA NA 0.8411134 NA NA NA
## 3 2017-01-03 NA 0.83085577 0.7154467 NA 1.414321 1.3900706
## 4 2017-01-04 0.35012582 NA NA NA NA NA
## 5 2017-01-05 1.06069822 0.02774169 NA NA NA 0.2398764
## 6 2017-01-06 NA NA NA NA NA NA
##
## X7 X8 X9 X10 Y1
## 1 NA NA NA NA 0.2435199
## 2 1.876632 1.2491742 NA 1.0733238 NA
## 3 NA NA NA 0.4446498 NA
## 4 1.343915 0.9339143 0.3653925 NA NA
## 5 1.607039 NA 0.4142871 NA 0.1997146
## 6 1.501782 0.3357399 NA 0.6406097 NA
mutate_at
mutate_at fonksiyonu belirli sütunlara dönüşüm uygulamak için geliştirilmiştir. select fonksiyon seçeneklerinin tümünü vars
argümanı içine yerleştirerek ilgili sütunlar seçilebilir.
“x” karakterini içeren sütunları contains ile seçenerek, ilgili sütunların 0’dan küçük değerine NA yerleştirelim. Bu koşulu bir önceki örnekten farklı olarak if_else yapısı ile sağlayalım.
sample_data %>%
mutate_at(vars(contains("x")), funs(if_else(. <= 0, NA_real_, .)) ) %>%
head()
## Date X1 X2 X3 X4 X5 X6
## 1 2017-01-01 0.08139727 NA NA 1.399025 1.138946 1.6755233
## 2 2017-01-02 NA NA 0.8411134 NA NA NA
## 3 2017-01-03 NA 0.83085577 0.7154467 NA 1.414321 1.3900706
## 4 2017-01-04 0.35012582 NA NA NA NA NA
## 5 2017-01-05 1.06069822 0.02774169 NA NA NA 0.2398764
## 6 2017-01-06 NA NA NA NA NA NA
##
## X7 X8 X9 X10 Y1
## 1 NA NA NA NA 0.2435199
## 2 1.876632 1.2491742 NA 1.0733238 -0.5183458
## 3 NA NA NA 0.4446498 -1.2081416
## 4 1.343915 0.9339143 0.3653925 NA -0.8392359
## 5 1.607039 NA 0.4142871 NA 0.1997146
## 6 1.501782 0.3357399 NA 0.6406097 -0.2731570
mutate_if
Her zaman için istenilen dönüşümü mutata_all fonksiyonu ile uygulamak mümkün olmayabilir. Örneğin exp(), abs() gibi matematiksel fonksiyonlar, numerik değişkenlerle çalıştığından farklı tipte sütunlardan oluşan veri setine mutate_all fonksiyonu ile uygulanamaz. Bu gibi durumlarda dönüşüm fonksiyonuna uygun tipteki sütunları is.numeric, is.integer, is.double, is.logical, is.factor, lubridate::is.POSIXt, lubridate::is.Date benzeri fonksiyonlarla seçebiliriz.
sample_data veri setindeki Date değişken tipi nümerik olmadığından abs dönüşümünü nümerik sütunları seçerek uygulayalım.
sample_data %>%
mutate_if(is.numeric, abs) %>%
head()
## Date X1 X2 X3 X4 X5
## 1 2017-01-01 0.08139727 0.58756796 1.0163808 1.39902470 1.1389458
## 2 2017-01-02 0.83263656 0.41980580 0.8411134 0.09661377 0.9767209
## 3 2017-01-03 0.67194692 0.83085577 0.7154467 1.15027696 1.4143209
## 4 2017-01-04 0.35012582 1.99541291 0.8500064 0.12070429 0.1781577
## 5 2017-01-05 1.06069822 0.02774169 0.5367324 1.21692945 1.3586523
## 6 2017-01-06 0.47946479 0.63658528 0.4642759 0.62563636 0.2993380
##
## X6 X7 X8 X9 X10 Y1
## 1 1.6755233 0.0703609 1.6780294 0.02057756 0.02144582 0.2435199
## 2 0.3929676 1.8766319 1.2491742 1.93172244 1.07332380 0.5183458
## 3 1.3900706 0.2533840 0.6042175 0.47502476 0.44464977 1.2081416
## 4 1.7711558 1.3439150 0.9339143 0.36539254 0.61154939 0.8392359
## 5 0.2398764 1.6070388 0.1166682 0.41428706 0.28791414 0.1997146
## 6 0.1169480 1.5017821 0.3357399 1.41591380 0.64060974 0.2731570