自%>%
包中引入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对象一起使用,包括列表和矩阵,而不仅仅是数据帧。
答案 0 :(得分:30)
分别对use_series
,extract2
,extract
使用$
,[[
和[
。
?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)
[是的,我知道这个例子毫无意义,但它说明了这一点]
另请注意,[<-
和[[<-
也有别名,inset
和inset2
..
答案 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