R语言统计分析——整合和重构

参考资料: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)
aggdata

attach(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)

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值