介绍如何使用reshape2包将宽型数据转换成长型数据,将长型数据转换成宽型数据。Reshape2是Hadley Wickham开发和维护的。

1.长数据VS宽数据

宽型数据:每列代表一个不同的变量。例如datasets包中的mtcars数据集就是宽型数据:

mt=mtcars
View(mt)

长型数据:一列包含了所有可能的变量,另一列是对应的取值。长数据有一列数据是变量的类型,有一列是变量的值。长数据不一定只有两列。ggplot2需要长类型的数据,plyr也需要长类型的数据,大多数的模型(比如lm(), glm()以及gam())也需要长数据。上面的数据可以用长型数据来表示:

# Long format
  variable value
      mpg  21.0
      mpg  21.0
      mpg  22.8
      mpg  21.4
      mpg  18.7
      mpg  18.1
...
    variable value
     carb
     carb
     carb
     carb
     carb
     carb     

  长型数据可以包含两个以上的列,尤其是提供ID变量的时候。

  在实际应用中,宽型数据更具可读性,长型数据则更适合做分析。因此,知道如何在它们之间进行转换非常有用。

reshape2包中两个主要的函数是:

  • melt——将宽型数据融合成长型数据
  • cast——将长型数据转成宽型数据

2.melt---将宽型数据融合成长型数据

定义及参数说明

melt(data, ..., na.rm = FALSE, value.name = "value")

melt(data,id.vars,measure.vars,variable.name="variable",..,na.rm=FALSE,value.name="value")

data 需要转换的数据集
na.rm Should NA values be removed from the data set? This will convert explicit missings to implicit missings
value.name 用于存储值的变量
id.vars:每个变量在结果中占一列
measure.vars:被当成观测值的列变量,列变量名称和值分别组成"variable"和"value"两列

  接下来,在datasets包中的mtcars数据集上进行操作。它一开始是上面展示的宽型数据。我们要把它融合成下面的长型数据:

#给mtcars增加一列car,其值为mtcars的行名

mtcars$car <- rownames(mtcars)

#将mtcars转换成长型数据

mtcarsMelt <- melt(mtcars)

head(mtcarsMelt)

  注:译者在R里得到的是melt自动选取car作为ID变量,原文是选取car和cyl作为ID变量。要得到相同结果只需在参数id.vars中指定相应变量即可。

我们可以通过参数variable.name和value.name分别对variable和value列重命名。例如,我们想对所有的汽车根据它的汽缸数和齿轮数做分类。可以像下面这样:

mtcarsMelt <- melt(mtcars, id.vars = c('cyl', 'gear'), variable.name = 'carVariable', value.name = 'carValue')

head(mtcarsMelt)

通常,使用变量组合来唯一的识别每个数据点个好办法,但是这里有多个点的cyl和gear组合值却是相同的,这不是好的办法。当你需要把数据转回宽型数据时会有点问题了(下面会看到)。

melt使用举例---ggplot2绘图:

aq <- melt(airquality,
           var.ids=c("Ozone", "Month", "Day"),
           measure.vars=c(:),
           variable.name="V.type",
           value.name="value")
head(aq)
View(aq)
library(ggplot2)
aq$Month <- factor(aq$Month)
p <- ggplot(data=aq, aes(x=Ozone, y=value, color=Month)) + theme_bw()
p <- p + geom_point(shape=, size=) + geom_smooth(aes(group=), fill="gray80") + facet_wrap(~V.type, scales="free_y")
p

3.cast---将长型数据转成宽型数据

dcast(data, formula, ..., value.var = guess_value(data))

formula: 以~为分割,左边的变量在整形后依然作为变量,右边的变量的取值拆为新的变量名,e.g. diet + chick ~ time

value.var: 新的变量名下的取值,需要加双引号

  cast函数的作用是将长型数据转成宽型数据。cast函数的两种主要类型是:

  • dcast——返回的结果是一个数据框
  • acast——返回的结果可以是向量、矩阵或者数组

  由于数据框对象是最常见的,我将演示如何使用dcast。下面展示的是长型数据转回成宽型数据:

mtcarsMelt <- melt(mtcars)
mtcarsCast <- dcast(mtcarsMelt, car ~ variable)
head(mtcarsCast)

  dcast函数通过一个式子来把数据转成宽型数据。在本篇译文中,由于我在R上自动的到ID变量只有car,所以我给出的式子是car ~ variable。这里car是ID变量,variable变量列的名称。要想跟原文一样只需在melt时指定id.vars参数即可。

如果我们指定cyl和gear作为ID变量融合数据后,再转回宽型变量时,会得到如下所示的结果:

mtcars$car <- rownames(mtcars)
mtcarsMelt <- melt(mtcars)
mtcarsCast <- dcast(mtcarsMelt, cyl + gear ~ variable)
head(mtcarsCast) 

  会得到警告信息:Aggregation function missing: defaulting to length。数据集显示的是每个cyl和gear组合的总的观测数。这是因为dcast函数不能唯一标识每个数据点。然而,它还有其他用处。例如,我们通过如下所示的fun.aggregate(如何聚合)参数可以得到每个cyl和gear组合值所对应的所有变量的平均值。

mtcars$car <- NULL
mtcarsMelt <- melt(mtcars, id.vars = c('cyl', 'gear'))
mtcarsCast <- dcast(mtcarsMelt, cyl + gear ~ variable, fun.aggregate = mean)
head(mtcarsCast)

View(mtcarsMelt)

  这里,删除了car列。这是因为不希望在mtcarsMelt的value列里存在非数值型数据,否则会得到错误。可以看到cyl的取值levels有4,6,8,而gear的取值有3,4,5,于是便可以取cyl与gear的组合后的项求其平均值。需要告诉dcast如何聚合(aggregate)这些数据,比如取均值(mean),计算中位数(median),或者简单的求和(sum)。比如,在这里,我们简单的计算下均值,同时通过na.rm = TRUE删除NA值。

melt

  使用场景:当数据框的几个列可以被归纳为某一个大类别时:比如列1为高速路,列2为快速路,列3为主要道路,这三列可以归结为一列道路等级。

案例:将表2变为表1

  table1 <- melt(table2, id.vars=c("车辆"), measure.vars=c("高速覆盖里程", "快速路覆盖里程", "主要道路覆盖里程"), variable.name="道路等级", value.name="日均覆盖里程")

dcast

  使用场景:数据框的某一个列可以拆分为多个小类别时:比如道路等级可以拆分为三列:高速路,快速路,主要道路;函数还需要指定拆出来的三列的值来自哪里。

案例:将表1变为表2

  table2 <- dcast(table1, 车辆~道路等级,value.var="日均覆盖里程")

同样可以看到下面的例子:

本文链接:http://www.cnblogs.com/homewch/p/5778409.html

最新文章

  1. xpath定位中starts-with、contains和text()的用法
  2. python处理经过gzip压缩的网页内容
  3. NAnt0.92版本首次在windows 8.1的机子上运行报错的问题解决
  4. redhat 6 / centos 6 搭建Django环境
  5. Python编程指南 chapter 1
  6. HDU 2101 A + B Problem Too 分类: ACM 2015-06-16 23:57 18人阅读 评论(0) 收藏
  7. HDU 5444 Elven Postman (二叉树,暴力搜索)
  8. GCC生成的汇编代码
  9. Dev-C++之开启装逼效果
  10. JQ 模仿注册时等待的时间
  11. 关于ztree打开关闭所有节点,选中指定id节点
  12. uva 10228 - Star not a Tree?(模拟退火)
  13. 你不知道的JavaScript--Item28 垃圾回收机制与内存管理
  14. div界面元素生成图片
  15. ansible-playbook 进行批量安装tomcat8
  16. windows下局域网文件共享,不需要登录账号密码
  17. [daily] 在CentOS7中使用 sanitizer-address 发现内存问题 / CentOS7使用SCLo软件源安装devtoolset软件
  18. 服务器--apache启用多个端口的方法
  19. CRC8校验
  20. CentOS7下解决yum install mysql-server没有可用包

热门文章

  1. window 环境安装MongoDB
  2. Mac与iPhone屏幕录制
  3. python异步爬虫
  4. Java中常见数据结构:list与map -底层如何实现
  5. 20145206邹京儒《Java程序设计》第6周学习总结
  6. git 提交代码的流程
  7. MVC缓存03,扩展方法实现视图缓存
  8. SQLAlchemy高级ORM之改查删除及GROUP,JOIN...
  9. 免费电子书:C#代码整洁之道
  10. 字幕文件 WebVTT 与 srt 之间的互相转化