R语言tidyverse包的管道操作符%>%

2022年5月30日18:40:28R语言tidyverse包的管道操作符%>%已关闭评论

R中已经有大量的自带函数和强大的数据结构,可以用来完成复杂的数据探索、数据科学工作。但是,有一个包提供了一个简洁、完整的数据科学工作流程,这个包是tidyverse。tidyverse包提供了一个完整的数据科学工作流程所需的工具,其中有很多子包可用于解决数据科学工作中各个步骤的任务。数据科学的步骤包括:数据的导入、数据的清洁、数据的转换、数据的探索及数据的可视化与建模。

tidyverse包的管道操作符%>%,这个操作符使用广泛。管道操作符的左边是数据,右边是函数,表示将左边的数据作为右边函数的第一个参数。例如,下面的代码绘制了一幅棒棒糖图,在绘图的过程中使用了大量的管道操作符,如图1.20所示。


library(ggplot2)
library(dplyr)
# 创建数据集
data <- data.frame(
  name=c("north","south","south-east","north-west","south-west","north-
east","west","east"),
  val=sample(seq(1,10), 8 )
)
data %>%
  arrange(val) %>%                                  # 对数据集使用val变量进行排序
  mutate(name=factor(name, levels=name)) %>%      # 对因子变量重新设置
  ggplot( aes(x=name, y=val)) +                     # 绘图
    geom_segment( aes(xend=name, yend=0)) +
    geom_point( size=4, color="orange") +
    coord_flip() +
    theme_bw() +
    xlab("")

 

R语言tidyverse包的管道操作符%>%

图1.20 棒棒糖图

上面的代码中,出现了3个管道操作符。第1个管道操作符的代码如下:


data %>%
  arrange(val)                               # 排序
##         name val
## 1       east   1
## 2 north-west   2
## 3 south-west   3
## 4 north-east   5
## 5       west   6
## 6      north   8
## 7 south-east   9
## 8      south  10

上面的代码表示对数据集通过val变量从小到大进行排序。第2个管道操作符的代码如下:


data %>%
  arrange(val) %>%    
  mutate(name=factor(name, levels=name))
##         name val
## 1       east   1
## 2 north-west   2
## 3 south-west   3
## 4 north-east   5
## 5       west   6
## 6      north   8
## 7 south-east   9
## 8      south  10

上面的代码表示对排序后的数据集进行处理,将排序好的数据集的name变量转换成为因子类型。第3个管道操作符表示将处理之后的数据集作为ggplot函数的第一个参数来绘制图形。管道操作符让代码更加具有可读性,避免了代码嵌套的问题。

管道操作符%>%广泛地用于tidyverse包,因为tidyverse包中有许多函数。这些函数执行相对较小的任务。管道操作符的思想是,函数是构建块,允许用户将函数组合在一起以产生所需的结果。为了加以说明,我们来看看下面这两个等价代码的简单例子。


f(x) = x %>% f()

管道操作符本质上是取左边的数据,并将它作为右边函数的第一个参数。对于有多个函数嵌套的情况,管道操作符的优势就显现出来了,例如下面的例子:


a(b(c(d(x)))) = x %>% d() %>% c() %>% b() %>% a()

在函数链中,函数调用的顺序与计算它们的顺序相同。如果希望存储最终结果,可以在开始时使用<-运算符。例如,这将用函数链的结果替换原来的x。


x <- x %>% d() %>% c() %>% b() %>% a()

 

  • A+
所属分类:R
  • 版权声明:本篇文章(包括图片)来自网络,由程序自动采集,著作权(版权)归原作者所有,如有侵权联系我们删除,联系方式(QQ:452038415)。