tidyverse Bakış Açısıyla Toplu Sütun Manipülasyonu

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