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("")
图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()