magrittr
パッケージに%>%
演算子が導入されてから(そしてdplyr
で使用されています)、これを自分の仕事で使用し始めました。
ただし、1つの簡単な操作で困惑しました。具体的には、これはリストからの要素の抽出(またはサブセット)です。
例:ベースRでは、$
、[
または[[
を使用して、リストから要素を抽出します。
iris$Species
iris[["Species"]]
%>%
パイプを使用して同じことを達成できます:
iris %>%
subset(select = "Species") %>%
head
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
または
iris %>%
`[[`("Species") %>%
levels
[1] "setosa" "versicolor" "virginica"
ただし、これは厄介で不格好なソリューションのように感じます。
%>%
パイプを使用してリストから要素を抽出するよりエレガントで標準的な方法はありますか?
注:dplyr
を含むソリューションは必要ありません。これは、ソリューションがデータフレームだけでなく、リストや行列を含む任意のRオブジェクトで機能するようにする簡単な理由です。
CRANのmagrittrのv 1.5では、%$%
演算子を使用できます。
iris %$%
Species %>%
levels
基本的にはwith
のラッパーですが、
iris %>%
with(Species %>% levels)
または
iris %>%
with(Species) %>%
levels
関数に独自のデータ引数がない場合に便利になるように設計されています。あなたができるプロットで
iris %>%
plot(Sepal.Length ~ Sepal.Width, data = .)
しかし、例えばts.plot
を使用すると、それを行うことはできません。
iris %$%
ts.plot(Sepal.Length)
[ええ、私は例が意味をなさないことを知っていますが、それは要点を示しています]
[<-
と[[<-
にもエイリアスinset
とinset2
があることにも注意してください。
use_series
、extract2
、$
には、それぞれ[[
、[
、extract
を使用します。
?extract
magrittrは一連のエイリアスを提供しますが、
%>%
演算子を使用してチェーンを作成するときに、より使いやすくなっています。 "
あなたの例では、あなたは試すことができます
iris %>%
extract("Species")
そして
iris %>%
extract2("Species") %>%
levels
詳細については、このページの下部をご覧ください: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html
より最近のtidyverse
ソリューション:pluck()
from purrr
(0.2.3以降)は、リスト(またはデータフレームの名前付き列)から名前付き要素を抽出します。
_library(tidyverse)
iris %>%
pluck("Species")
_
注:インデックス番号で要素にアクセスするには、dplyr
のfirst()
、last()
またはnth()
を任意のオブジェクト(リスト、データフレーム、行列)、最初、最後、またはn番目の要素を抽出します。
_iris %>%
as.list() %>% # unnecessary, just to show it works on lists too
last() # or nth(5) in this case, to get Species
_