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

1.长数据VS宽数据

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

  1. mt=mtcars
  2. View(mt)

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

  1. # Long format
  2. variable value
  3. mpg 21.0
  4. mpg 21.0
  5. mpg 22.8
  6. mpg 21.4
  7. mpg 18.7
  8. mpg 18.1
  9. ...
  10. variable value
  11. carb
  12. carb
  13. carb
  14. carb
  15. carb
  16. carb

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

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

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

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

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

定义及参数说明

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

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

  1. #给mtcars增加一列car,其值为mtcars的行名
  2.  
  3. mtcars$car <- rownames(mtcars)
  4.  
  5. #将mtcars转换成长型数据
  6.  
  7. mtcarsMelt <- melt(mtcars)
  8.  
  9. head(mtcarsMelt)

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

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

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

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

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

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

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

  1. dcast(data, formula, ..., value.var = guess_value(data))
  2.  
  3. formula: 以~为分割,左边的变量在整形后依然作为变量,右边的变量的取值拆为新的变量名,e.g. diet + chick ~ time
  4.  
  5. value.var: 新的变量名下的取值,需要加双引号

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

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

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

  1. mtcarsMelt <- melt(mtcars)
  2. mtcarsCast <- dcast(mtcarsMelt, car ~ variable)
  3. head(mtcarsCast)

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

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

  1. mtcars$car <- rownames(mtcars)
  2. mtcarsMelt <- melt(mtcars)
  3. mtcarsCast <- dcast(mtcarsMelt, cyl + gear ~ variable)
  4. head(mtcarsCast)

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

  1. mtcars$car <- NULL
  2. mtcarsMelt <- melt(mtcars, id.vars = c('cyl', 'gear'))
  3. mtcarsCast <- dcast(mtcarsMelt, cyl + gear ~ variable, fun.aggregate = mean)
  4. 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

reshape2包--R高效数据处理包的更多相关文章

  1. R(6): 数据处理包dplyr

    dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口,本节学习dplyr包函数基本用法 ...

  2. R语言数据处理包dplyr、tidyr笔记

    dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...

  3. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...

  4. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记   dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...

  5. ggplot2包--R可视化

    1.ggplot2发展历程 ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley ...

  6. 数据处理包plyr和dplyr包的整理

    以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...

  7. R语言扩展包dplyr笔记

    引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...

  8. R语言常用包分类总结

    常用包: ——数据处理:lubridata ,plyr ,reshape2,stringr,formatR,mcmc: ——机器学习:nnet,rpart,tree,party,lars,boost, ...

  9. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 在之前的开篇提到了text2vec ...

随机推荐

  1. spring AOP 的几种实现方式(能测试)

    我们经常会用到的有如下几种 1.基于代理的AOP 2.纯简单Java对象切面 3.@Aspect注解形式的 4.注入形式的Aspcet切面 一.需要的java文件 public class ChenL ...

  2. SQL Server占用内存的认识

    SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer).执行缓存(Procedure Cache).以及SQL Server引擎程序.SQL Server引擎程序所占用缓存 ...

  3. 利用bak文件恢复数据库问题小结

    对备份的基础理解: --完整备份:完整备份会备份所有数据的区和少量的日志(日志文件用于恢复数据保持数据一致性).由于差异备份需要依据最后一次完整备份,因此完整备份会清楚一些分配位图数据. --差异备份 ...

  4. Kl 证明 凸函数

    回到随机变量传输问题,假设传输中我们不知道具体 分布情况(unknown),我们用一个已知的分布 ,来模拟它,那么在这种情况下如果我们利用 尽可能高效的编码,那么我们平均需要多少额外的信息量来描述x呢 ...

  5. Tomcat的Session管理机制

    >>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...

  6. How many Fibs?【sudt 2321】【大数的加法及其比较】

    How many Fibs? Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Recall the definition of t ...

  7. 攻城狮在路上(叁)Linux(十六)--- 命令与文件的查找

    一.脚本文件的查询: 1.命令格式:which [-a] command; <==通过PATH来查找. -a:列出所有的,而不是仅列出第一个. 示例: which ifconfig; 注意:由于 ...

  8. WCF批量打开服务

    WCF服务.利用循环,读取配置文件,打开所有的代理服务 和关闭代理服务的方法 //list列表 ,用于存储打开的服务列表 List<ServiceHost> _host = new Lis ...

  9. WPF实现TextBox水印效果

    在日常项目中,一个TextBox需要输入用户名,我们通常的做法是先用一个TextBlock来说明,例如下面的截图: 今天将使用另外一种方式来展示,使用水印的方式.请参考下面的代码: <Windo ...

  10. 在Virtulbox上装Ubuntu

    做个程序员,会用Linux,这应该是最基本的要求吧.可惜本人经常用Windows,只是偶尔去服务器上做些操作的时候才接触到linux.so,我要学Linux.刚学所以还是先装个虚拟机吧,等在虚拟机上用 ...