参考资料:R语言实战【第2版】
R中提供了许多用来整合(aggregate)和重塑(reshape)数据的强大方法。在整合数据时,往往将多组观测替换为根据这些观测计算的描述性统计量。在重塑数据时,则会通过修改数据的结构(行和列)来决定数据的组织方式。
1、转置
使用函数t()即可对一个矩阵或者数据框进行转置,对于后者,行名将变成列名。
cars<-mtcars[1:5,1:4]
cars
t(cars)
2、整合数据
在R中使用一个或多个by变量和一个预先定义好的函数来折叠(collapse)数据是比较容易的。调用格式为:
aggregate(x,by,FUN)
其中,x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测的值。
options(digits=3)
attach(mtcars)
aggdata<-aggregate(mtcars,by=list(cyl,gear),FUN=mean,na.rm=TRUE)
detach(mtcars)
aggdataattach(mtcars)
aggdata<-aggregate(mtcars,by=list(Group.cyl=cyl,Group.gear=gear),FUN=mean,na.rm=TRUE)
detach(mtcars)
aggdata
在aggregate()函数中,by中的变量必须是一个列表(即使只有一个变量)。我们可以在列表中为各组声明自定义的名称,例如:my=list(Group.cyl=cyl,Group.gears=gear)。指定的函数可以是任意的内建函数或自定义函数。
3、reshape2包
reshape2包是一套重构和整合数据集的绝妙的万能工具。由于reshape2包并未安装在R的标准安装中,在第一次使用它之前需要使用install.packages("reshape2")进行安装。
大致来说,我们需要首先将数据融合(melt),以使每一行都是唯一的标识符-变量组合。然后将数据重铸(cast)为我们想要的任何形状。在重铸过程中,我们可以使用任何函数对数据进行整合。
library(reshape2)ID<-c(1,1,2,2)
Time<-c(1,2,1,2)
X1<-c(5,3,6,2)
X2<-c(6,5,1,4)
mydata<-data.frame(ID,Time,X1,X2)
mydata
(1)融合
数据集的融合是将它重构为这样一种格式:每个测量独占一行,行中带有要唯一确定这个测量所需的标识符变量。
md<-melt(mydata,id=c('ID','Time'))
md
注意,必须指定要唯一确定每个测量所需的变量(本例是ID和Time),而表示测量变量名的变量(本例是X1和X2)将由程序自动创建。
(2)重铸
dcast()函数读取已融合的数据,并使用我们提供的公式和一个(可选的)用于整合数据的函数将其重塑。调用格式为:
newdata<-dcast(md,format,fun.aggregate)
其中,md为已融合的数据,formula描述了想要的最后结果,而fun.aggregate是(可选的)数据整合函数。其接受的公式形式如:
rowvar1+rowvar2+...~colvar1+colvar2+...
在这一公式中,rowvar1+rowvar2+...定义了要划掉的变量集合,以确定各行的内容,而colvar1+colvar2+...则定义了要划掉的、确定各列内容的变量集合。如下图:
由于上图中右侧(d,e和f)的公式中未包含某个函数,所以数据仅被重塑了。反之,左侧的示例(a、b和c)中指定了mean作为整合函数,从而就对数据同时进行了重复和整合。
# a
dcast(md,ID~variable,mean)
# b
dcast(md,Time~variable,mean)
# c
dcast(md,ID~Time,mean)
# d
dcast(md,ID+Time~variable)
# e
dcast(md,ID+variable~Time)
# f
dcast(md,ID~variable+Time)