• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【R笔记】R语言进阶之4:数据整形(reshape)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
2013-05-31 10:15 xxx 网易博客 字号:T | T

从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数据整形不仅仅是为了改善数据的外观,也是进行一些统计分析和作图前必要的步骤。数据整形和数据凝练/汇总往往密不可分,这是门学问,是R语言数据处理的内容之一。

AD:51CTO技术沙龙 | 赋予APP不同凡响的交互和体验>>

 

来源: http://developer.51cto.com/art/201305/396615.htm

 一、通过重新构建数据进行整形

数据整形最直接的思路就把数据全部向量化,然后按要求用向量构建其他类型的数据。这样是不是会产生大量的中间变量、占用大量内存?没错。R语言的任何函数(包括赋值)操作都会有同样的问题,因为R函数的参数传递方式是传值不传址,变量不可能原地址修改后再放回原地址。

矩阵和多维数组的向量化有直接的类型转换函数: as.vector,向量化后的结果顺序是先列后行再其他:

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

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

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

其他类型的数据一般都可以通过数组、矩阵或列表转成向量。一些软件包有自定义的数据类型,如果考虑周到的话应该会有合适的类型转换函数。

二、transform 和 within函数

transform 函数对数据框进行操作,作用是为原数据框增加新的列变量。但应该注意的是“原数据框”根本不是原来的那个数据框,而是一个它的拷贝。下面代码为airquality数据框增加了一列log.ozone,但因为没有把结果赋值给原变量名,所以原数据是不变的:

  1. > head(airquality,2) 
  2.   Ozone Solar.R Wind Temp Month Day 
  3. 1    41     190  7.4   67     5   1 
  4. 2    36     118  8.0   72     5   2 
  5. > aq <- transform(airquality, loglog.ozone=log(Ozone)) 
  6. > head(airquality,2) 
  7.   Ozone Solar.R Wind Temp Month Day 
  8. 1    41     190  7.4   67     5   1 
  9. 2    36     118  8.0   72     5   2 
  10. > head(aq,2) 
  11.   Ozone Solar.R Wind Temp Month Day log.ozone 
  12. 1    41     190  7.4   67     5   1  3.713572 
  13. 2    36     118  8.0   72     5   2  3.583519 

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

  1. > aq <- transform(airquality, loglog.ozone=log(Ozone), Ozone=NULLWindWind=Wind^2) 
  2. > head(aq,2) 
  3.   Solar.R  Wind Temp Month Day log.ozone 
  4. 1     190 54.76   67     5   1  3.713572 
  5. 2     118 64.00   72     5   2  3.583519 
  6.  
  7. > aq <- transform(airquality, loglog.ozone=log(Ozone), Ozone=NULLMonth=NULLWindWind=Wind^2) 
  8. > head(aq,2) 
  9.   Solar.R  Wind Temp Day log.ozone 
  10. 1     190 54.76   67   1  3.713572 
  11. 2     118 64.00   72   2  3.583519 

within 比 transform 灵活些,除数据框外还可以使用其他类型数据,但用法不大一样,而且函数似乎也不够完善:

  1. > aq <- within(airquality, { 
  2. + log.ozone <- log(Ozone) 
  3. + squared.wind <- Wind^2 
  4. + rm(Ozone, Wind) 
  5. + } ) 
  6. > head(aq,2) 
  7.   Solar.R Temp Month Day squared.wind log.ozone 
  8. 1     190   67     5   1        54.76  3.713572 
  9. 2     118   72     5   2        64.00  3.583519 
  10.  
  11. > (x <- list(a=1:3, b=letters[3:10], c=LETTERS[9:14])) 
  12. $a 
  13. [1] 1 2 3 
  14. $b 
  15. [1] "c" "d" "e" "f" "g" "h" "i" "j" 
  16. $c 
  17. [1] "I" "J" "K" "L" "M" "N" 
  18.  
  19. > within(x, {log.a <- log(a); d <- paste(b, c, sep=':'); rm(b)}) 
  20. $a 
  21. [1] 1 2 3 
  22. $c 
  23. [1] "I" "J" "K" "L" "M" "N" 
  24. $d 
  25. [1] "c:I" "d:J" "e:K" "f:L" "g:M" "h:N" "i:I" "j:J" 
  26. $log.a 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言- 实验报告 - 数据清洗发布时间:2022-07-18
下一篇:
拓端tecdat|R语言代写多分类问题multicalssclassification的性能测量发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap