dplyrが使えないけど、[]で要素の抽出をしたくないときに
バージョンやらインストールやらの問題でdplyrが使えないときには、dply::select
やdplyr::filter
が使えない。そうするとデータフレームからの要素の抽出には[]
を使わざるを得なくなり、コードが見にくくなる。
そんな時にはパイプでおなじみのmagrittrが活躍する。
magrittrには演算子やオペレータのエイリアスが多く用意されているので、これを使うことで足し算やら論理演算やら要素の操作やらをfunctional sequenceのなかに組み込めるようになる。
magrittr::extract
は[]
に対するエイリアスであり。magrittr::extract
を使えば、
{抽出対象データフレーム}[{選択する行}, {選択する列}]
を
magrittr::extract({抽出対象データフレーム}, {選択する行}, {選択する列})
# ベクトルに対しても使用可
と書くことができる。
これを生かせば、magrittr::extract
をdplyr::select
とdplyr::filter
の代わりとして使うことができる。
※ magrittrが入っていないときには、install.packages("magrittr")
でインストール
※ extract
はtidyrからマスクされるので、magrittr::extract
と書くことを推奨
※ 以下パイプを使いますが、magrittr::extract
はパイプと連結しなくても使えます
dplyr::selectの代用
例:irisでSeapal.LengthとSepal.Widthを抽出
通し番号による抽出
# base
iris[, c(1, 2)]
# dplyr
iris %>% dplyr::select(1, 2)
# magrittr
iris %>% magrittr::extract(., , c(1, 2))
列名による抽出
# base
iris[, c("Sepal.Length", "Sepal.Width")]
# dplyr
iris %>% dplyr::select(Sepal.Length, Sepal.Width)
# magrittr
iris %>% magrittr::extract(., , c("Sepal.Length", "Sepal.Width"))
列名の一致による抽出
# base
iris[, grep("Sepal", names(iris))]
# dplyr
iris %>% dplyr::select(contains("Sepal"))
# magrittr
iris %>% magrittr::extract(., , grep("Sepal", names(.)))
第一引数に.
を渡し、第2引数(選択行)にを渡す。列名の場合は
""
で囲う必要があるので注意。
contains
のような選択をしたい時には、grep
で列名の中から一致するものの位置を取得する。
dplyr::filterの代用
例:irisでPetal.Lengthが6より大きいかつSpeciesがvirginicaである行を抽出
# base
iris[iris$Petal.Length > 6 & iris$Species == "virginica", ]
# dplyr
iris %>% dplyr::filter(Petal.Length > 6 & Species == "virginica")
# magrittr
iris %>% magrittr::extract(., iris$Petal.Length > 6 & iris$Species == "virginica", )
iris %$% magrittr::extract(., Petal.Length > 6 & Species == "virginica", )
第一引数に.
を渡し、第3引数(選択列)にを渡す。
iris$
を省略したい場合は、%>%
を%$%
にする(右辺で列名が参照できるようになる)。
dplyrの場合はrownames
がリセットされるが、baseとmagrittrの場合には元のrownames
が引き継がれるので注意。