R语言中提供了许多用来整合和重塑数据的强大方法。

  • 整合 aggregate
  • 重塑 reshape

  在整合数据时,往往将多组观测值替换为根据这些观测计算的描述统计量。

  在重塑数据时,则会通过修改数据的结构(行与列)来决定数据的组织方式。

  样例数据:mtcars

  从Motor Trend杂志(1974)提取的,它描述了34种车型的设计和性能特点(气缸数、排量、马力、每加仑汽油行驶的英里数,等等,详细可使用help(mtcars)。

一、转置

  反转行和列,使用函数t()即可对一个矩阵或数据框进行转置。

  1. cars <- mtcars[1:5,1:4]
  2. > cars
  3. mpg cyl disp hp
  4. Mazda RX4 21.0 6 160 110
  5. Mazda RX4 Wag 21.0 6 160 110
  6. Datsun 710 22.8 4 108 93
  7. Hornet 4 Drive 21.4 6 258 110
  8. Hornet Sportabout 18.7 8 360 175
  9.  
  10. t(cars)
  11. > t(cars)
  12. Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
  13. mpg 21 21 22.8 21.4 18.7
  14. cyl 6 6 4.0 6.0 8.0
  15. disp 160 160 108.0 258.0 360.0
  16. hp 110 110 93.0 110.0 175.0

二、整合数据

  在R中使用一个或者多个by变量和一个预先定义好的函数来折叠(collapse)数据。

调用格式:

  aggregate(x, by, FUN)

  • x:数据对象
  • by:变量名组成的列表
  • FUN:用来计算描述性统计量的标量函数

示例:根据气缸数和档位数整合mtcars数据,并返回各个数值型变量的均值。

  1. options(digits = 3) # 修改小数点后的精确位数
  2. attach(mtcars) # 加载进内存
  3. aggdata <- aggregate(mtcars, by = list(cyl,gear), FUN = mean, na.rm = TRUE)
  4. aggdata
  5. detach(mtcars) # 从内存删除
  6.  
  7. > aggdata
  8. Group.1 Group.2 mpg cyl disp hp drat wt qsec vs am gear carb
  9. 1 4 3 21.5 4 120 97 3.70 2.46 20.0 1.0 0.00 3 1.00
  10. 2 6 3 19.8 6 242 108 2.92 3.34 19.8 1.0 0.00 3 1.00
  11. 3 8 3 15.1 8 358 194 3.12 4.10 17.1 0.0 0.00 3 3.08
  12. 4 4 4 26.9 4 103 76 4.11 2.38 19.6 1.0 0.75 4 1.50
  13. 5 6 4 19.8 6 164 116 3.91 3.09 17.7 0.5 0.50 4 4.00
  14. 6 4 5 28.2 4 108 102 4.10 1.83 16.8 0.5 1.00 5 2.00
  15. 7 6 5 19.7 6 145 175 3.62 2.77 15.5 0.0 1.00 5 6.00
  16. 8 8 5 15.4 8 326 300 3.88 3.37 14.6 0.0 1.00 5 6.00

  在使用aggregate()函数的时候,by中的变量必须在一个列表中(即使只有一个变量),指定的函数可为任意的内建或自编函数。

三、reshape包

  reshape包是一套重构和整合数据集的万能工具。

  1. install.packages("reshape")
  2. library(reshape)
  •   将数据“融合”(melt),使得每一行都是一个唯一的标识符-变量组合。
  •   将数据“重铸”(cast),变成任意想要的形状。
  1. mydata <- data.frame(
  2. ID = c(1,1,2,2),
  3. Time = c(1,2,1,2),
  4. X1 = c(5,3,6,2),
  5. X2 = c(6,5,1,4)
  6. )

  测量(measurement)指最后两列的值。

1.融合

  每个测量变量独占一行,行中带有要唯一确定这个测量所需要的标识符变量。

  1. md <- melt(mydata, id = c("ID","Time"))
  1. > melt(mydata, id = c("ID","Time"))
  2. ID Time variable value
  3. 1 1 1 X1 5
  4. 2 1 2 X1 3
  5. 3 2 1 X1 6
  6. 4 2 2 X1 2
  7. 5 1 1 X2 6
  8. 6 1 2 X2 5
  9. 7 2 1 X2 1
  10. 8 2 2 X2 4

  必须指定要唯一确定每个测量所需要的变量。现在可以使用cast()函数重铸为任意形状。

2.重铸(reshape包cast,reshape不提供cast)

  cast()函数读取已融合的数据,并使用提供的公式和一个(可选的)用于整合数据的函数将其重塑。调用格式为:

  1. newdata <- cast(x, formula, FUN)
  2.  
  3. formula : row1 + row2 ~ col1 + col2
  •   row:定义要划掉的变量集合,确定各行的内容
  •   col:定义要划掉、确定各列内容的变量集合
  1. > cast(md,ID ~ variable, mean)
  2. ID X1 X2
  3. 1 1 4 5.5
  4. 2 2 4 2.5
  5.  
  6. > cast(md, Time ~ variable, mean)
  7. Time X1 X2
  8. 1 1 5.5 3.5
  9. 2 2 2.5 4.5
  10.  
  11. > cast(md, ID ~ Time, mean)
  12. ID 1 2
  13. 1 1 5.5 4
  14. 2 2 3.5 3
  15.  
  16. > cast(md, ID + Time ~ variable) # 不执行整合
  17. ID Time X1 X2
  18. 1 1 1 5 6
  19. 2 1 2 3 5
  20. 3 2 1 6 1
  21. 4 2 2 2 4
  22.  
  23. > cast(md, ID + variable ~ Time)
  24. ID variable 1 2
  25. 1 1 X1 5 3
  26. 2 1 X2 6 5
  27. 3 2 X1 6 2
  28. 4 2 X2 1 4

  缺少FUN时,数据仅被重塑,而不被整合。

四、reshape2包

  Hadley Wickham大神写了很多R语言包,包括ggplot2、plyr、reshape/reshape2等。

  reshape2中主要使用函数:melt、acast、dcast等。

  • melt : 拆分数据(会自动根据数据类型:data.frame、array、list选择函数进行实际操作)

1.数组(array)类型

  依次对各维度的名称进行组合将数据进行线性/向量化。如果数据有N维,得到的结果共有N+1列,前N列记录数组的位置信息,最后一列才是观测值。

  1. datax <- array(1:8, dim = c(2,2,2))
  2.  
  3. > melt(datax)
  4. X1 X2 X3 value
  5. 1 1 1 1 1
  6. 2 2 1 1 2
  7. 3 1 2 1 3
  8. 4 2 2 1 4
  9. 5 1 1 2 5
  10. 6 2 1 2 6
  11. 7 1 2 2 7
  12. 8 2 2 2 8
  13.  
  14. > melt(datax, varnames = LETTERS[24:26], value.name = "Val")
  15. X Y Z value
  16. 1 1 1 1 1
  17. 2 2 1 1 2
  18. 3 1 2 1 3
  19. 4 2 2 1 4
  20. 5 1 1 2 5
  21. 6 2 1 2 6
  22. 7 1 2 2 7
  23. 8 2 2 2 8

2.列表(list)类型

  将列表中的数据拉成两列,一列记录列表元素的值,另一列记录列表元素的名称。如果列表中的元素是列表,则增加列变量存储元素名称。元素值排列在前,名称在后,越是顶级的列表元素名称越靠后。

  1. datax <- list(
  2. agi="AT1G10000",
  3. go=c("GO:1000","GO:2000"),
  4. kegg=c("","","")
  5. )
  6.  
  7. > melt(datax)
  8. value L1
  9. 1 AT1G10000 agi
  10. 2 GO:1000 go
  11. 3 GO:2000 go
  12. 4 0100 kegg
  13. 5 0200 kegg
  14. 6 0300 kegg
  15.  
  16. > melt(list(at_0441=datax))
  17. value L2 L1
  18. 1 AT1G10000 agi at_0441
  19. 2 GO:1000 go at_0441
  20. 3 GO:2000 go at_0441
  21. 4 0100 kegg at_0441
  22. 5 0200 kegg at_0441
  23. 6 0300 kegg at_0441

3.数据框(data.frame)类型

  1. melt(data, id.vars, measure.vars,
  2. variable.name = "xxx",
  3. value.name = "yyy",
  4. na.rm = FALSE)
  •   id.vars:维度的列变量,在结果中占一列
  •   measure.vars:观测值的列变量,名称和值分别组成variable和value两列
  •   variable.name & value.name 列变量名称
  1. > str(airquality)
  2. 'data.frame': 153 obs. of 6 variables:
  3. $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
  4. $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
  5. $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
  6. $ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
  7. $ Month : int 5 5 5 5 5 5 5 5 5 5 ...
  8. $ Day : int 1 2 3 4 5 6 7 8 9 10 ...
  9.  
  10. > head(airquality)
  11. Ozone Solar.R Wind Temp Month Day
  12. 1 41 190 7.4 67 5 1
  13. 2 36 118 8.0 72 5 2
  14. 3 12 149 12.6 74 5 3
  15. 4 18 313 11.5 62 5 4
  16. 5 NA NA 14.3 56 5 5
  17. 6 28 NA 14.9 66 5 6

  按月份分析臭氧和太阳辐射、风速、温度三者之间的关系,可以转化:

  1. > aq <- melt(airquality,
  2. + id = c("Ozone","Month","Day"),
  3. + measure = c(2:4),
  4. + variable.name = "V.type",
  5. + value.name = "value")
  6.  
  7. > head(aq) # id.vars/var.ids/id 都可以
  8. Ozone Month Day variable value
  9. 1 41 5 1 Solar.R 190
  10. 2 36 5 2 Solar.R 118
  11. 3 12 5 3 Solar.R 149
  12. 4 18 5 4 Solar.R 313
  13. 5 NA 5 5 Solar.R NA
  14. 6 28 5 6 Solar.R NA

  id和measure两个参数可以只指定其中一个,剩余的列被当成另外一个参数的值。如果两个都省略,数值型的列被看成观测值,其他的被当成id。如果想省略参数或者去掉部分数据,参数名最好用 id/measure,否则得到的结果可能不理想。

  最好使用id=1之类的来定义。

  melt以后的数据,称为molten数据,用ggplot2做统计图就很方便,可以快速做出我们需要的图形,例如:

  1. library(ggplot2)
  2. str(aq)
  3. aq$Month <- factor(aq$Month)
  4.  
  5. p <- ggplot(data = aq,
  6. aes(x = Ozone, y = value, color = Month)) + theme_bw()
  7. p + geom_point(shape = 20, size = 4) +
  8. geom_smooth(aes(group = 1),fill = "gray80") +
  9. facet_wrap(~ V.type, scales="free_y")

  melt获得的数据(molten data)可以使用acast或dcast还原。

  • acast:获得数组
  • dcast:获得数据框

  公式左边每个变量都会作为结果的一列,而右边的变量被当成因子类型,每个水平都会在结果中产生一列。

  1. > head(dcast(aq, Ozone+Month+Day ~ variable))
  2. Ozone Month Day Solar.R Wind Temp
  3. 1 1 5 21 8 9.7 59
  4. 2 4 5 23 25 9.7 61
  5. 3 6 5 18 78 18.4 57
  6. 4 7 5 11 NA 6.9 74
  7. 5 7 7 15 48 14.3 80
  8. 6 7 9 24 49 10.3 69

  dcast函数的作用不止是还原数据,还可以使用函数对数据进行汇总(aggregate)。

  1. > dcast(aq, Month ~ variable,fun.aggregate=mean,na.rm=TRUE)
  2. Month Solar.R Wind Temp
  3. 1 5 181 11.62 65.5
  4. 2 6 190 10.27 79.1
  5. 3 7 216 8.94 83.9
  6. 4 8 172 8.79 84.0
  7. 5 9 167 10.18 76.9 

END 2018-10-30 00:07:24

R语言学习笔记:使用reshape2包实现整合与重构的更多相关文章

  1. R语言学习笔记:glue包实现变量传参

    glue包介绍 glue包可用于自定义变量,然后通过传参的方式,对字符串部分内容进行自适应修改. 例如:可将日期赋值为:date = as.Date("2019-12-05"),然 ...

  2. R语言学习笔记︱Echarts与R的可视化包——地区地图

    笔者寄语:感谢CDA DSC训练营周末上完课,常老师.曾柯老师加了小课,讲了echart与R结合的函数包recharts的一些基本用法.通过对比谢益辉老师GitHub的说明文档,曾柯老师极大地简化了一 ...

  3. R语言学习笔记:使用tcltk包显示进度条

    一般在跑耗时较长的程序时,我们不知道程序到底有没有正常跑着,或者在爬虫的时候不知道爬到什么时候断了.因此可以添加进度条来显示当前进度,观察进度是否有进展.当进度条卡住的时候,可以判断程序断线,从而可以 ...

  4. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

  5. R语言学习笔记:基础知识

    1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) ...

  6. R语言学习笔记-机器学习1-3章

    在折腾完爬虫还有一些感兴趣的内容后,我最近在看用R语言进行简单机器学习的知识,主要参考了<机器学习-实用案例解析>这本书. 这本书是目前市面少有的,纯粹以R语言为基础讲解的机器学习知识,书 ...

  7. R语言学习笔记(二)

    今天主要学习了两个统计学的基本概念:峰度和偏度,并且用R语言来描述. > vars<-c("mpg","hp","wt") &g ...

  8. R语言学习笔记

    向量化的函数 向量化的函数 ifelse/which/where/any/all/cumsum/cumprod/对于矩阵而言,可以使用rowSums/colSums.对于“穷举所有组合问题" ...

  9. R语言学习笔记-变量的作用域

    R语言是如何将变量值和变量绑定的 在r语言中,当前的 workspace就是global enviroment,当输入变量名时,首先会在global enviroment中搜索该变量,如有,则将它显示 ...

随机推荐

  1. Centos7.2安装tomcat+Myeclipse(遇到的一些问题与总结)+web项目实战

    工作环境:centos7.2 PS:没有耐心的同学可以直接跳到后面的安装方法,对于安装方法大多是网上的,我只是做相关收集和总结 给个tomca和Myeclipset折腾的半死,现在做一些总结1.一定要 ...

  2. bzoj 2120

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6430  Solved: 2562[Submit][Status][Discuss] ...

  3. 【Asp.net入门05】第一个ASP.NET 应用程序-测试Asp.net程序

    测试示例应用程序 本部分内容: ASP.NET应用程序测试方法 web窗体访问过程 Visual Studio工具栏上有一个下拉列表,其中列出了工作站上已安装的浏览器的名称(单击浏览器名称右侧的向下箭 ...

  4. python3.5中import sqlite3报错:ImportError: No module named _sqlite3

    原因:缺少相关库 解决方案: 1  安装相关库 yum install sqlite-devel 2  重新编译安装Python

  5. vue的全局指令

    vue有四个全局指令:directive.extent.set.component directive:自定义指令 //写一个改变颜色的指令 Vue.directive('amie',function ...

  6. 用js获取客户端IP地址

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type=& ...

  7. matplotlib基础整理

    matplotlib主要从下面几个方面进行整理: 折线图绘制:https://douzujun.github.io/page/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98% ...

  8. 关于thinkpad安装win10操作系统

    thinkpad预装的是win8或者win10,会有自己的分区方式是GPT,所以会出现两个引导分区. F2进入tinkpad的bios,F12进入启动选项 我们用pe进入后,用分区工具删除两个分区,然 ...

  9. Jekens 配置多项目SCM GitLab+Jenkins持续集成环境

    参考: 搭建GitLab+Jenkins持续集成环境图文教程 https://blog.csdn.net/ruangong1203/article/details/73065410 Jenkins中配 ...

  10. 《PHP和MySQL Web开发》读书笔记(下篇)

    又与大家见面了.继续<PHP和MySQL Web开发>的总结. Chapter8.设计Web数据库 ·回去看看数据卡那本书吧,这里就不累赘谈这个东西. Chapter9.创建Web数据库 ...