LoginSignup
0
1

More than 3 years have passed since last update.

dplyr::selectとdplyr::filterをmagrittr::extractで代用(困ったときの小技)

Last updated at Posted at 2020-02-19

dplyrが使えないけど、[]で要素の抽出をしたくないときに

バージョンやらインストールやらの問題でdplyrが使えないときには、dply::selectdplyr::filterが使えない。そうするとデータフレームからの要素の抽出には[]を使わざるを得なくなり、コードが見にくくなる。

そんな時にはパイプでおなじみのmagrittrが活躍する。
magrittrには演算子やオペレータのエイリアスが多く用意されているので、これを使うことで足し算やら論理演算やら要素の操作やらをfunctional sequenceのなかに組み込めるようになる。
magrittr::extract[]に対するエイリアスであり。magrittr::extractを使えば、

{抽出対象データフレーム}[{選択する行}, {選択する列}]

magrittr::extract({抽出対象データフレーム}, {選択する行}, {選択する列})
# ベクトルに対しても使用可

と書くことができる。

これを生かせば、magrittr::extractdplyr::selectdplyr::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が引き継がれるので注意。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1