web-dev-qa-db-ja.com

magrittr%>%パイプを使用してリストから要素を抽出/サブセット化する方法は?

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オブジェクトで機能するようにする簡単な理由です。

31
Andrie

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)

[ええ、私は例が意味をなさないことを知っていますが、それは要点を示しています]

[<-[[<-にもエイリアスinsetinset2があることにも注意してください。

28
Stefan

use_seriesextract2$には、それぞれ[[[extractを使用します。

?extract

magrittrは一連のエイリアスを提供しますが、%>%演算子を使用してチェーンを作成するときに、より使いやすくなっています。 "

あなたの例では、あなたは試すことができます

iris %>%
  extract("Species")

そして

iris %>%
  extract2("Species") %>%
  levels

詳細については、このページの下部をご覧ください: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

30
Bangyou

より最近のtidyverseソリューション:pluck() from purrr(0.2.3以降)は、リスト(またはデータフレームの名前付き列)から名前付き要素を抽出します。

_library(tidyverse)

iris %>% 
  pluck("Species")
_

注:インデックス番号で要素にアクセスするには、dplyrfirst()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
_
1
iNyar