R语言进阶之四:数据整形(reshape)

从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数据整形不仅仅是为了改善数据的外观,也是进行一些统计分析和作图前必要的步骤。数据整形和 数据凝练/汇总往往密不可分,这是门学问,是R语言数据处理的内容之一。
一、通过重新构建数据进行整形
数据整形最直接的思路就把数据全部向量化,然后按要求用向量构建其他类型的数据。这样是不是会产生大量的中间变量、占用大量内存?没错。R语言的任何函数(包括赋值)操作都会有同样的问题,因为R函数的参数传递方式是传值不传址,变量不可能原地址修改后再放回原地址。
矩阵和多维数组的向量化有直接的类型转换函数: as.vector,向量化后的结果顺序是先列后行再其他:

> (x <- matrix(1:4, ncol=2)) #为节省空间,下面的结果省略了一些空行
[,1] [,2]
[1,] 1 3
[2,] 2 4
> as.vector(x)
[1] 1 2 3 4
> (x <- array(1:8, dim=c(2,2,2)))
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
> as.vector(x)
[1] 1 2 3 4 5 6 7 8

列表向量化可以用unlist,数据框本质是元素长度相同的列表,所以也用unlist:

> (x <- list(x=1:3, y=5:10))
$x
[1] 1 2 3
$y

[1]  5  6  7  8  9 10
> unlist(x)
x1 x2 x3 y1 y2 y3 y4 y5 y6
 1  2  3  5  6  7  8  9 10
> x <- data.frame(x=1:3, y=5:7)
> unlist(x)
x1 x2 x3 y1 y2 y3
 1  2  3  5  6  7

其他类型的数据一般都可以通过数组、矩阵或列表转成向量。一些软件包有自定义的数据类型,如果考虑周到的话应该会有合适的类型转换函数。
二、transform 和 within函数
transform 函数对数据框进行操作,作用是为原数据框增加新的列变量。但应该注意的是“原数据框”根本不是原来的那个数据框,而是一个它的拷贝。下面代码为airquality数据框增加了一列log.ozone,但因为没有把结果赋值给原变量名,所以原数据是不变的:

> head(airquality,2)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
> aq <- transform(airquality, log.ozone=log(Ozone))
> head(airquality,2)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
> head(aq,2)
  Ozone Solar.R Wind Temp Month Day log.ozone
1    41     190  7.4   67     5   1  3.713572
2    36     118  8.0   72     5   2  3.583519

transform可以增加新列变量,可以改变列变量的值,也可以通过NULL赋值的方式删除列变量:

> aq <- transform(airquality, log.ozone=log(Ozone), Ozone=NULL, Wind=Wind^2)
> head(aq,2)
Solar.R Wind Temp Month Day log.ozone
1 190 54.76 67 5 1 3.713572
2 118 64.00 72 5 2 3.583519

> aq <- transform(airquality, log.ozone=log(Ozone), Ozone=NULL, Month=NULL, Wind=Wind^2)
> head(aq,2)
Solar.R Wind Temp Day log.ozone
1 190 54.76 67 1 3.713572
2 118 64.00 72 2 3.583519

within 比 trans
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值