问题
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