1.长/宽数据
R语言中,90%的情况下都是使用长型数据,比如构建回归模型,或者利用ggplot2构图,因此当遇到宽型数据时,第一时间就是要把它们转变成长型数据。
①宽型数据
每一列为一个变量,每一行为变量所对应的值
> library(openxlsx)
> data = read.xlsx("/Users/afei/Desktop/test.xlsx")
> head(data)
组别 1月份 2月份 3月份 4月份 5月份 6月份
1 一组 40589 46475 54354 46497 40231 45402
2 二组 49351 54296 42200 47931 39243 41578
3 三组 41983 53099 39552 48860 53591 41799
4 四组 53883 52806 46719 38767 47856 42595
5 五组 41859 46403 45893 43950 51762 50848
6 六组 40231 48046 44355 49756 44490 50003
②长型数据
一列包含了所有的变量,而另一列则是与之相关的值,长数据不一定只有两列
组别 月份 value
1 一组 1月份 40589
2 二组 1月份 49351
3 三组 1月份 41983
4 四组 1月份 53883
5 五组 1月份 41859
6 六组 1月份 40231
2.melt
通常,我们会拿到一个数据表,将其转换为一系列事项,然后将其修整为所需的格式。将数据表转换成事项列表的过程称为熔解(melt),将事项列表转换成数据表的过程称为铸造(cast)。
melt函数:将宽数据转换成长数据(逆透视)
cast函数:将长数据转换成宽数据(透视)
melt是一个泛型函数,在reshape2包中有分别用于数据框、数组和列表的melt方法。
melt(data,id.vars,measure.vars,variable.name='variable',...,na.rm=FALSE,value.name='value',factorAsStrings=TRUE)
下面简单介绍各个参数:
#要溶解的数据框:data
#ID变量(用于标识观察的变量):id.vars
#测量变量(用于描述所测量的事物的变量):measure.vars
#用于保存原始变量名的变量的名称:variable.name
#用于保存原始值的名称:value.name
#告诉melt如何处理NA值:na.rm,na.rm = TRUE删除NA值
#告诉melt是否要将字符变量转化成因子:factorAsStrings
举例(此处用R内置的airquality数据集):
#首先将列名改成小写
names(airquality) <- tolower(names(airquality))
#查看相应的数据
head(airquality)
默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。如果id.vars和measure.vars都没有设置,默认会使用所有的因子变量和字符变量作为ID变量,使用所有的非因子和非字符变量作为测量变量
#直接用metl函数处理上述的数据
aql <- melt(airquality)
head(aql)
#再看末尾的几个数据
tail(aql)
数据集的熔解是将它重构为这样一种格式:每个观测变量独占一行,行中要带有唯一确定这个测量所需的标识变量。
使用id.vars参数的情况:此时想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉melt,month和day是"ID variables"
aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)
使用variable.name和value.name的情况:此时想修改长数据中的列名
md <- melt(airquality, id.vars = c("month", "day"), value.name = "New_Value", variable.name = "Class")
head(md)
使用measure.vars的情况
ml <- melt(airquality,id.vars = c("month","day"),measure.vars = "ozone")
head(ml)
#再看末尾的几个数据
tail(ml)
3.cast
①dcast:针对数据框
dcast借助于公式来描述数据的形状,左边参数表示"ID variables",而右边的参数表示measured variables。可能需要几次尝试,才能找到合适的公式。
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL, fill = NULL, drop = TRUE,value.var = guess_value(data))
下面简单介绍各个参数:
#已溶解的数据框(通常是melt函数创建的):data
#描述输出结果的公式,比如x~y,则x表示数据透视表的行,y代表数据透视表的列:formula
#聚合函数。如果要聚合输出结果中一溶解的数据,用这个参数可以设置聚合函数。可以使用自定义函数:fun.aggregate
#相当于透视表中的行总计和列总计:margins
#选取满足一些特定值的数据,相当于Excel透视表的筛选:subset。例如, subset =.(variable ==“length”)
举例(此处仍使用R内置的airquality数据集):
#去除缺失值
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
head(aqm)
#计算按月份分组的每个变量的均值以及行列合计
dcast(aqm, month ~ variable, mean, margins = c("month", "variable"),na.rm=TRUE)
#和上面的例子一样,对调了一下行和列
dcast(aqm, variable ~ month, mean, margins = c("month", "variable"))
②acast:针对向量、矩阵、数组
函数表达式同dcast,只是输出结果不同
acast输出结果省略了id这个列,而dcast则输出id列
举例(此处仍使用R内置的airquality数据集):
dcast(aqm,month~variable,mean)
acast(aqm,month~variable,mean)
#加margins参数后,仍为以上区别
dcast(aqm, month ~ variable, mean, margins = TRUE)
acast(aqm, month ~ variable, mean, margins = TRUE)
#只对列求平均值
dcast(aqm, month ~ variable,mean,margins=c("month"))
acast(aqm, month ~ variable,mean,margins=c("month"))
#只对行求平均值
dcast(aqm, month ~ variable,mean,margins=c("variable"))
acast(aqm, month ~ variable,mean,margins=c("variable"))
#三维的情况下acast输出的是一个数组,而dcast则报错,因为dcast输出结果为数据框。
dcast(aqm,month ~ day ~ variable)
acast(aqm,month ~ day ~ variable)
#使用subset参数的情况
library(plyr) #为了使用subset函数
dcast(aqm,variable~month,mean,subset=.(variable=="ozone"))
acast(aqm,variable~month,mean,subset=.(variable=="ozone"))
dcast(aqm,variable~month,mean,subset=.(month==5))
acast(aqm,variable~month,mean,subset=.(month==5))
dcast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))
acast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))