如何使用magrittr%>%pipe从列表中提取/子集元素?

And*_*rie 29 r magrittr

自从%>%magrittr包中引入运算符(并且它在其中使用)以来dplyr,我已经开始在我自己的工作中使用它.

然而,一个简单的操作让我难过.具体而言,这是从列表中提取(或子集化)元素.

一个示例:在基RI将使用$,[[[以提取从一个列表中的一个元素:

iris$Species
iris[["Species"]]
Run Code Online (Sandbox Code Playgroud)

我可以使用%>%管道实现相同的目标:

iris %>%
  subset(select = "Species") %>%
  head

  Species
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa
Run Code Online (Sandbox Code Playgroud)

要么

iris %>%
  `[[`("Species") %>%
  levels

[1] "setosa"     "versicolor" "virginica" 
Run Code Online (Sandbox Code Playgroud)

然而,这感觉就像一个混乱,笨重的解决方案.

是否有更优雅,规范的方法使用%>%管道从列表中提取元素?

注意:我不想要任何涉及的解决方案dplyr,原因很简单,我希望解决方案能够与任何R对象一起使用,包括列表和矩阵,而不仅仅是数据帧.

Ban*_*you 30

使用use_series,extract2extract$,[[,[,分别.

?extract
Run Code Online (Sandbox Code Playgroud)

magrittr提供了一系列别名,使用%>%操作员组合链时可以更愉快地使用."

举个例子,你可以试试

iris %>%
  extract("Species")
Run Code Online (Sandbox Code Playgroud)

iris %>%
  extract2("Species") %>%
  levels
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅本页底部:http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html


Ste*_*fan 28

在CRAN上的magrittr v 1.5中,您可以使用%$%运算符:

iris %$% 
  Species %>%
  levels
Run Code Online (Sandbox Code Playgroud)

它本质上是一个包装,with但比更好

iris %>% 
  with(Species %>% levels)
Run Code Online (Sandbox Code Playgroud)

要么

iris %>%
  with(Species) %>%
  levels
Run Code Online (Sandbox Code Playgroud)

当函数没有自己的数据参数时,它被设计为方便,例如,您可以使用绘图

iris %>% 
  plot(Sepal.Length ~ Sepal.Width, data = .)
Run Code Online (Sandbox Code Playgroud)

但是,例如ts.plot你不能这样做,所以现在:

iris %$%
  ts.plot(Sepal.Length)
Run Code Online (Sandbox Code Playgroud)

[是的,我知道这个例子毫无意义,但它说明了这一点]

还要注意[<-并且[[<-还有别名,inset并且inset2..


iNy*_*yar 6

一个更新的tidyverse解决方案:pluck()from purrr(自 0.2.3 起)从列表(或数据框中的命名列)中提取命名元素:

library(tidyverse)

iris %>% 
  pluck("Species")
Run Code Online (Sandbox Code Playgroud)

注意:要按索引号访问元素,您还可以在任何对象(列表、数据框、矩阵)上使用first(),last()nth()fromdplyr来提取其第一个、最后一个或第 n 个元素:

iris %>% 
  as.list() %>%  # unnecessary, just to show it works on lists too
  last()         # or nth(5) in this case, to get Species
Run Code Online (Sandbox Code Playgroud)