Help us understand the problem. What is going on with this article?

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

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が引き継がれるので注意。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした