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

时间:2014-11-24 08:32:33

标签: r magrittr

%>%包中引入magrittr运算符(并在dplyr中使用)后,我开始在自己的工作中使用它。

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

示例:在基础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对象一起使用,包括列表和矩阵,而不仅仅是数据帧。

3 个答案:

答案 0 :(得分:30)

分别对use_seriesextract2extract使用$[[[

?extract
  

magrittr提供了一系列可以更愉快的别名   在使用%>%运算符组合链时使用。“

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

iris %>%
  extract("Species")

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

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

答案 1 :(得分:26)

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

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 ..

答案 2 :(得分:1)

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

library(tidyverse)

iris %>% 
  pluck("Species")

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

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