Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@ocean_f

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

More than 1 year has passed since last update.

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

参考

1
Help us understand the problem. What is going on with this article?
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
ocean_f

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?