自从%>%在magrittr包中引入运算符(并且它在其中使用)以来dplyr,我已经开始在我自己的工作中使用它.
然而,一个简单的操作让我难过.具体而言,这是从列表中提取(或子集化)元素.
一个示例:在基RI将使用$,[或[[以提取从一个列表中的一个元素:
iris$Species
iris[["Species"]]
Run Code Online (Sandbox Code Playgroud)
我可以使用%>%管道实现相同的目标:
iris %>%
subset(select = "Species") %>%
head
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
Run Code Online (Sandbox Code Playgroud)
要么
iris %>%
`[[`("Species") %>%
levels
[1] "setosa" "versicolor" "virginica"
Run Code Online (Sandbox Code Playgroud)
然而,这感觉就像一个混乱,笨重的解决方案.
是否有更优雅,规范的方法使用%>%管道从列表中提取元素?
注意:我不想要任何涉及的解决方案dplyr,原因很简单,我希望解决方案能够与任何R对象一起使用,包括列表和矩阵,而不仅仅是数据帧.
Ban*_*you 30
使用use_series,extract2并extract为$,[[,[,分别.
?extract
Run Code Online (Sandbox Code Playgroud)
magrittr提供了一系列别名,使用
%>%操作员组合链时可以更愉快地使用."
举个例子,你可以试试
iris %>%
extract("Species")
Run Code Online (Sandbox Code Playgroud)
和
iris %>%
extract2("Species") %>%
levels
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅本页底部:http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html
Ste*_*fan 28
在CRAN上的magrittr v 1.5中,您可以使用%$%运算符:
iris %$%
Species %>%
levels
Run Code Online (Sandbox Code Playgroud)
它本质上是一个包装,with但比更好
iris %>%
with(Species %>% levels)
Run Code Online (Sandbox Code Playgroud)
要么
iris %>%
with(Species) %>%
levels
Run Code Online (Sandbox Code Playgroud)
当函数没有自己的数据参数时,它被设计为方便,例如,您可以使用绘图
iris %>%
plot(Sepal.Length ~ Sepal.Width, data = .)
Run Code Online (Sandbox Code Playgroud)
但是,例如ts.plot你不能这样做,所以现在:
iris %$%
ts.plot(Sepal.Length)
Run Code Online (Sandbox Code Playgroud)
[是的,我知道这个例子毫无意义,但它说明了这一点]
还要注意[<-并且[[<-还有别名,inset并且inset2..
一个更新的tidyverse解决方案:pluck()from purrr(自 0.2.3 起)从列表(或数据框中的命名列)中提取命名元素:
library(tidyverse)
iris %>%
pluck("Species")
Run Code Online (Sandbox Code Playgroud)
注意:要按索引号访问元素,您还可以在任何对象(列表、数据框、矩阵)上使用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
Run Code Online (Sandbox Code Playgroud)