reshape2包--R高效数据处理包
介绍如何使用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
reshape2包--R高效数据处理包的更多相关文章
- R(6): 数据处理包dplyr
dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口,本节学习dplyr包函数基本用法 ...
- R语言数据处理包dplyr、tidyr笔记
dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
- R语言中的数据处理包dplyr、tidyr笔记
R语言中的数据处理包dplyr.tidyr笔记 dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...
- ggplot2包--R可视化
1.ggplot2发展历程 ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley ...
- 数据处理包plyr和dplyr包的整理
以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...
- R语言扩展包dplyr笔记
引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...
- R语言常用包分类总结
常用包: ——数据处理:lubridata ,plyr ,reshape2,stringr,formatR,mcmc: ——机器学习:nnet,rpart,tree,party,lars,boost, ...
- R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 在之前的开篇提到了text2vec ...
随机推荐
- iOS 控制屏幕旋转
在你想支持横竖屏的viewController里面重写两个方法: 1 2 3 4 5 6 7 8 9 10 11 // 支持设备自动旋转 - (BOOL)shouldAutorotate { ...
- Redis 数据持久化(一)
Redis的模块化开发设计的还是相当不错的,在Bio.h和Bio.c文件中定义了一个多线程的文件任务处理模块,在添加和处理任务的时候使用互斥锁和条件变量进行的同步,而且本身也支持多线程,这个模块的支持 ...
- python基础——匿名函数
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
- jsp 过滤器 Filter 配置
.如果要映射过滤应用程序中所有资源: <filter> <filter-name>loggerfilter</filter-name> <filt ...
- Stuts2的"struts.devMode"设置成true后,不起作用,仍需要重启tomcat
在项目的struts.xml加入了常量配置:<constant name="struts.devMode" value="true" />后,重启服 ...
- Redis笔记(八)Redis的持久化
Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...
- App 开发:Hybrid 架构下的 HTML5 应用加速方案
在移动 App 开发领域,主流的开发模式可分为 Native.Hybrid.WebApp 三种方式.然而 2013 年,纯 WebApp 开发模式的发展受到一定挫折,以 Facebook 为代表的独立 ...
- php重修
阅读顺序: http://www.laruence.com/2008/08/11/147.html 深入浅出php http://www.laruence.com/2008/06/18/221.ht ...
- 团队作业-第一周-NABCD竞争性需求分析
1. Need 需求 随着科技信息的发展,传统的课堂点名亟待步入信息处理的轨道,移动校园课堂点名软件恰好的切入了这个需求点,市场中词类软件也为数不多,因此需求也是比较强烈. 2. Approac ...
- 第十五篇:在SOUI中消息通讯
SOUI是一套基于Win32 SDK的窗口开发的一套DirectUI框架.在SOUI中除了有真窗口使用窗口消息通讯机制外,还有SOUI控件之间的通讯,及控件的事件处理等. 1.真窗口消息通讯 因此可以 ...