2.1 表格的转换
2.1.1 表格的变换
在使用R ggplot2绘图时,通常使用一维数据列表的数据框。但是如果导入的数据表格是二维数据列表,我们则需要使用reshape2包的melt()函数或者tidyr包的gather()函数,可以将二维数据列表的数据框转换成一维数据列表(见图2-1-1)。我们首先构造数据框:
df<- data.frame(x=c('A', 'B', 'C'), '2010'=c(1,3,4), '2011'=c(3,5,2), check.names=FALSE)
(1)将宽数据转换为长数据,将多行聚集成列,从而将二维数据列表变成一维数据列表:
df_melt<- reshape2::melt(df, id.vars="x", variable.name="year", value.name = "value") df_gather<- tidyr:: gather(df, year, value, -x)
其中,id.vars("x")表示由标识变量构成的向量,用于标识观测的变量;variable.name("year")表示用于保存原始变量名的变量的名称;value.name("value")表示用于保存原始值的名称。
(2)将长数据转换为宽数据,将一列根据变量展开为多行,从而将一维数据列表变成二维数据列表:
df_dcast<- reshape2:: dcast(df_melt, x~year, value.var="value") df_spread <- tidyr::spread(df_gather, year, value)
其中,dcast借助于公式来描述数据的形状id.vars~variable.name,左边参数表示id.vars("x"),而右边的参数表示variable.name("year")。
图2-1-1 表格变换的示意案例
2.1.2 变量的变换
有时候,我们需要对数据框中某列的每个元素都进行运算处理,从而产生并添加新的列(见图2-1-2)。我们可以使用R内置函数transform()为原数据框添加新的列,可以改变原变量列的值,也可以赋值NULL删除列变量:
dat1<-transform(df_melt, value2=value*2)
我们也可以结合向量化的条件语句ifelse()进行更加复杂的运算。另外,dplyr包的mutate()函数也能实现与transform()函数相同的功能。但是mutate()函数很好地解决了transform()函数不能解决的问题,即mutate()函数允许新列对刚刚建立起来的列进行计算。
dat2<- transform(df_melt, value2=ifelse(year=="2011", value*2, value)) dat2<- dplyr:: mutate(df_melt, value2=ifelse(year=="2011", value*2, value))
图2-1-2 变量变换的示意案例
2.1.3 表格的排序
我们可以使用sort()函数对向量进行排序处理(见图2-1-3)。对于数据框,我们也可以使用dplyr包的arrange()函数,根据数据框的某列数值对整个表排序。其中desc(value)表示根据df的value列做降序处理,如dat_arrange2数据框所示。
dat_arrange1<- dplyr:: arrange(df_melt, value) dat_arrange2<- dplyr:: arrange(df_melt, desc(value))
图2-1-3 表格排序的示意案例