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

Andrie picture Andrie · Nov 24, 2014 · Viewed 13.8k times · Source

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.

Answer

Bangyou picture Bangyou · Nov 24, 2014

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