R语言数据可视化之美 · 第2章

精读版:概念讲解 + 代码,画图前的数据准备

2.1 表格的转换

一句话:ggplot2画图要长格式数据,本章讲各种表格变形。

2.1.1 表格的变换

一句话:宽表→长表用melt()/gather()——画图前数据整理的第一步。

在使用Rggplot2绘图时,通常使用一维数据列表的数据框。但是如果导入的数据表格是二维数据列表,我们则需要使用reshape2包的melt()函数或者tidyr包的gather()函数,可以将二维数据列表的数据框转换成一维数据列表(见

ch_图2-1-1.png
图2-1-1

)。我们首先构造数据框:

2.1.2 变量的变换

一句话:transform()/mutate()给表加计算列,mutate能引用刚建的新列。

有时候,我们需要对数据框中某列的每个元素都进行运算处理,从而产生并添加新的列(见图2-1-2)。我们可以使用R内置函数transform()为原数据框添加新的列,可以改变原变量列的值,也可以赋值NULL删除列变量:

但是mutate()函数很好地解决了transform()函数不能解决的问题,即mutate()函数允许新列对刚刚建立起来的列进行计算

2.1.3 表格的排序

一句话:sort()排向量、arrange()排数据框,desc()降序。

我们可以使用sort()函数对向量进行排序处理(见

ch_图2-1-3_表格排序的示意案例.png
图2-1-3

)。对于数据框,我们也可以使用dplyr包的arrange()函数,根据数据框的某列数值对整个表排序。其中desc(value)表示根据df的value列作降序处理,如datarrange2数据框所示。

dat_arrange1<-dplyr:arrange(df_melt,value)dat_arrange2<-dplyrarrange(df_melt,desc(value))

2.2 表格的整理

一句话:拼接、融合、分组——把散数据合成一张干净的表。

2.2.1 表格的拼接

一句话:cbind()/rbind()拼表,或dplyr的bind_cols()/bind_rows()。

有时候,我们需要在已有数据框的基础上添加新的行/列,或者横向/纵向添加另外一个表格。此时我们需要使用R内置函数cbind()和rbind(),或者dplyr包的bindcols()函数和bindrows()函数实现该功能。先构造3个数据框如下:

ch_图2-2-1_表格拼接的示意案例.png
图2-2-1

所示。

2.2.2 表格的融合

一句话:两个表靠共同列merge()/join()合并,left/right/inner/full四种连法。

有时候,两个数据框并没有很好地保持一致,不能简单地使用cbind()函数或rbind()函数直接拼接。所以它们需要一个共同的列(commonkey)作为融合的依据。在表格的融合中,最常用的函数是R内置函数merge()和dplyr包的*_join()系列函数。

我们首先构造4个数据框,如下:

ch_图2-2-2_表格融合的示意案例.png
图2-2-2

所示。其优势在于对每个数据框可以指定不同的匹配列名;缺点在于运行速度比较慢。其中,by.x是指左边数据框的匹配列,by.y是指右边数据框的匹配列。

dat_merge1<-merge(df1.df2,by=x",all=TRUE)dat_merge3<-merge(df1,df4.by=c("x""y").all=TRUE)88IR语言数据可视化之美:专业图表绘制指南效果如

ch_图2-2-3_merge(函数融合表格的示意案例.png
图2-2-3

所示。dplyr包提供了left_join()、right_join()、inner_join()和full_join()四个函数,可以实现不同的表格融合效果。其中,full_join()函数主要用来生成两个集合的并集:inner_join()函数通常用来生成有效的数据:leftjoin()函数和rightjoin()函数使用的场景偏少。

另外,两个表格融合时会用NA(缺失值)代替不存在的值。·只保留左表的所有数据:

ch_图2-2-4_join(系列函数融合表格的示意案例.png
图2-2-4

所示。by=c(x","y")表示多列匹配:

ch_图2-2-5_join0系列函数复杂融合表格的示意案例.png
图2-2-5

所示。

2.2.3 表格的分组操作

一句话:按类别分组汇总:aggregate() 或 group_by()+summarise()+管道。

数据框中往往存在某列包含多个类别的数据的情况,如dfSX包含A、B和C三个不同类别的数据,dfmeltSyear包含2010和2011两个类别的数据。我们有时候需要按数据框的列/行,或者按数据类别进行分类运算处理等,此时数据的分组操作就尤为重要。先构造两个数据框如下:

ch_图2-2-6_表格分组操作的案例数据框.png
图2-2-6

所示。可以使用R内置函数apply()对数据框按行/列求和,也可以使用内置函数rowSums()和colSums()实现相同的结果:

只根据year分组操作:

使用时把数据集名作为开头,然后依次对此数据进行多步操作。这种运算符的编写方式使得编程者可以按数据处理时的思路写代码,一步一步操作不断叠加,在程序上就可以非常清晰地体现数据处理的步骤与背后的逻辑。只根据year分组操作,实现的结果与aggregate(value~year,df_melt,mean)一致,

ch_图2-2-7_按year分组求均值.png
图2-2-7

所示为按year分组求均值:dplyr :summarise(avg =mean(value)同时根据year和x两个变量分组操作,实现的结果与aggregate(value~year+x,df_melt,mean)一致,

ch_图2-2-8_按year和x两列变量分组求均值.png
图2-2-8

所示为按year和x两列变量分组求均值:

本章一句话总结:数据整理四件套:宽表转长表、mutate加计算列、merge合表、group_by+summarise分组汇总——论文拿到原始数据的第一步就是转成长表。
×