library("seplyr")について

こちらは、R advent calendar 2017の記事になります。今回は、趣味で練習しているlibrary("seplyr")について簡単な紹介をします。(勉強不足ゆえ、様々なご意見を頂ければ幸いです。)

1."seplyr"と"dplyr"

data wranglingといえば"dplyr"ですが、"dplyr"は主に非標準評価を用いています。(dplyrで標準評価は非推奨とされています。)例えば、"dplyr"でdataset "iris"の"Sepal.Length"の標本平均と標準偏差を計算したいとき、次のようなscriptを書くでしょう。

library(dplyr)
iris %>%
    summarize(mean_sepal_length = mean(Sepal.Length), 
                       sd_sepal_length = sd(Sepal.Length))

一方で、seplyrでは主に標準評価の関数を準備しています。先程と同じようなことをseplyrでやってみると、

library("seplyr")
iris %.>%
    summarize_se(., c("mean_sepal_length" := "mean(Sepal.Length)", 
                                 "sd_sepal_length" := "sd(Sepal.Length)"))

と、しっかりquoteして書くことになります。

2."seplyr"の何が良いのか?

"seplyr"を使って最初に気づくことは、次のようなコーディングも可能だということです。

program <- c("mean_sepal_length" := "mean(Sepal.Length)",
                       "sd_sepal_length" := "sd(Sepal.Length)")
iris %.>% summarize_se(., program) %.>% .$mean_sepal_length

"dplyr"でもこのようなことは可能かもしれませんが、"seplyr"で書くほうがすっきりparameterとして別個に書くことが出来ます。scriptの再利用のとき、これはとても見やすく便利だと感じました。もちろん、

threshold_1 <- 5.2
threshold_2 <- 1.2
program <- c("Sepal.Length>threshold_1", "Sepal.Width>threshold_2")
iris %.>% filter_se(., program) %.>% head(.$Species, 30)

というscriptも安心して書くことが出来ます。他にも同様に

iris %.>%
    mutate_se(., "metre.Sepal.Length":="Sepal.Length/100") %.>% head(.)

と出来ます。

3. "seplyr"の特徴

"seplyr"のユニークな関数に"if_else_device"があります。例えば、次のように条件に合ったデータに対して、特定の列に操作を加えることが出来ます。

category <- "setosa"
cond_then <- c("Sepal.Length" := "Sepal.Length*100",
                          "Sepal.Width" := "Sepal.Width*100")
cond_else <- c("Sepal.Length" := "NA")
program <- if_else_device(testexpr = "Species==category",
                                           thenexprs = cond_then,
                                           elseexprs = cond_else)
plan <- partition_mutate_se(program)
iris %.>% mutate_seb(., plan)


サポートをいただいた場合、新たに記事を書く際に勉強する書籍や筆記用具などを買うお金に使おうと思いますm(_ _)m