How to extract / subset an element from a list with the magrittr %>% pipe?

☆樱花仙子☆ 提交于 2019-12-18 11:42:19

问题


Since the introduction of the %>% operator in the magrittr package (and it's use in dplyr), I have started to use this in my own work.

One simple operation has me stumped, however. Specifically, this is the extraction (or subsetting) of elements from a list.

An example: In base R I would use $, [ or [[ to extract an element from a list:

iris$Species
iris[["Species"]]

I can achieve the same using the %>% pipe:

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

  Species
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa

Or

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

[1] "setosa"     "versicolor" "virginica" 

However, this feels like a messy, clunky solution.

Is there a more elegant, canonical way to extract an element from a list using the %>% pipe?

Note: I don't want any solution involving dplyr, for the simple reason that I want the solution to work with any R object, including lists and matrices, not just data frames.


回答1:


In v 1.5 of magrittr on CRAN you can use the %$% operator:

iris %$% 
  Species %>%
  levels

It is essentially a wrapper around with but nicer than

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

or

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

It is designed to be convinient when functions don't have their own data argument, e.g. with plot you can do

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

but e.g. with ts.plot you can't do that, so now:

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

[yeah, I know the example makes no sense, but it illustrates the point]

Note also that [<- and [[<- also have aliases, inset and inset2..




回答2:


Use use_series, extract2 and extract for $, [[, [, respectively.

?extract

magrittr provides a series of aliases which can be more pleasant to use when composing chains using the %>% operator."

For your example, you could try

iris %>%
  extract("Species")

and

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

See the bottom of this page for more: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html




回答3:


A more recent tidyverse solution: pluck() from purrr (since 0.2.3) extracts a named element from a list (or a named column from a data frame):

library(tidyverse)

iris %>% 
  pluck("Species")

Note: to access the element by index number, you can also use first(), last() or nth() from dplyr on any object (list, data frame, matrix) to extract its first, last or nth element:

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


来源:https://stackoverflow.com/questions/27100678/how-to-extract-subset-an-element-from-a-list-with-the-magrittr-pipe

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!