37

自从在包中引入%>%操作符magrittr(并且在 中使用dplyr),我已经开始在自己的工作中使用它。

然而,一个简单的操作让我难住了。具体来说,这是从列表中提取(或子集)元素。

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

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 对象,包括列表和矩阵,而不仅仅是数据框。

4

3 回答 3

35

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

?extract

magrittr 提供了一系列别名,在使用%>%运算符组成链时使用起来会更愉快。”

对于您的示例,您可以尝试

iris %>%
  extract("Species")

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

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

于 2014-11-24T08:42:27.687 回答
33

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

iris %$% 
  Species %>%
  levels

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

iris %>% 
  with(Species %>% levels)

或者

iris %>%
  with(Species) %>%
  levels

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

iris %>% 
  plot(Sepal.Length ~ Sepal.Width, data = .)

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

iris %$%
  ts.plot(Sepal.Length)

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

还要注意[<-and[[<-也有别名,insetinset2..

于 2014-11-24T09:42:52.170 回答
7

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

library(tidyverse)

iris %>% 
  pluck("Species")

注意:要通过索引号访问元素,您还可以使用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
于 2019-04-21T14:20:51.173 回答