微信号:gh_61e2455df34c

介绍:介绍R语言的学习和使用,关注数据挖掘算法,利用R语言实现常见的数据挖掘算法,并配以有趣的NBA数据分析案例.不管您是初学还是精通R语言,本平台都致力于让您能从中获益.

数据处理之—reshape2

2016-07-31 09:29 №→★飞刀

reshape2是用来做数据处理的拓展包,它可以用来实现宽格式数据与长格式数据之间的互转。如果你熟悉结构化数据库查询,那你一定知道列转行与行转列,我这里所说的宽长数据之间互转与之类似;如果你不熟悉的也没关系,它很简单,接着往下看你就能很快熟悉并掌握了。首先我们通过一个数据集来解释什么是长宽数据。

宽格式数据 

该数据为我在数据类型及数据结构一文中用到的一个数据集,这里用来说明长宽数据格式的区别。 该数据集包括NBA明星球员的姓名,身高以及职业生涯最高分。这个数据集为典型的宽格式数据,即每一列为一个观测变量,每一行为变量对应的观测值。 

该数据为我在数据类型及数据结构一文中用到的一个数据集,该数据集包括NBA明星球员的姓名,身高以及职业生涯最高分。这个数据集为典型的宽格式数据,即每一列为一个观测变量,每一行为变量对应的观测值。 

长格式数据

长格式数据至少包含一列变量名称以及一列该变量名对应的取值,我们将nba数据集用reshape2中的melt函数进行长数据格式的转换,转换完成后可以看到数据还是三列,但是后两列的列名变了,variable 为包含变量名称的列,它包含先前数据集的两个列名height和score,value为NBA球员对应两个观测变量下的取值。这时我们就会发现数据由5行变成了10行,即由“宽”变“长”了,这便是所谓的长格式数据了。 

melt

melt是数据融合的意思,它做的工作其实就是把数据由“宽”转“长”。melt是一个泛型函数,与predict函数类似,predict函数可以根据不同的模型对象来产生不同模型下的预测值,melt则可以根据不同的数据结构,进行不同的数据融合操作。 

如果数据是array或者matrix,melt函数会将其索引拆分为不同的变量,其中的数值为索引对应的取值。 

如果matrix有行名和列名,melt函数会用行名和列名代替索引,如下: 

如果数据是是列表,melt函数会生成两列,一列为列表不同层级对应的名称,一列为该层级下的数据。

当列表存在多层嵌套时,melt函数会生成多列,前几列为层级名称,一级嵌套在前,层级缺失则会显示缺失值。

重点来了,我们知道在做数据操作的时候,用到的最多的数据结构是数据框,如果数据类型是数据框,melt函数该如何操作呢,melt函数中有很多对数据框进行操作的参数,其中id.vars是被当做维度的列变量,每个变量在结果中占一列;measure.vars是被当成观测值的列变量,它们的列变量名称和值分别组成variable和value两列,列变量名称用variable.name和value.name来指定。

我们用一个新的数据集来做说明,该数据集pgdat为NBA当红组织后卫库里,康利,保罗,沃尔,威少,欧文最近一个赛季的常规赛单场数据统计,数据如下: 

该数据包括了参赛场次,球员姓名,胜负关系,比分,上场时间,得分,篮板,助攻等数据。如果我们想要比较这几位组织后卫的得分,助攻数据,可以用 melt 将其转化为如下数据框:

有人会问 melt 以后的数据能干嘛,为什么要 melt,这就不得不提 Hadley 大神了,这位大神就职于 Rstudio,写了很多很牛的包,reshap2 只他写的众多包中的一个。他写的著名的包还有如 plyr 包以及之后的升级版 dplyr 都是致力于提高数据处理效率的,ggplot2 包以图层叠加的的方式实现数据可视化。最牛的是这些包是可以相互协作的。采用 reshape2 包中的 melt 函数能够使宽数据转成长数据,而长数据可以方便用 dplr 或者 dplyr 来做数据处理的操作,这些数据处理的结果又能很方便地用 ggplot2 定制统计图表。 例如,以上长数据就可以用 ggplot2 的绘图命令实现数据可视化: 


cast  

melt 是把宽数据转为长数据,当然也有函数可以将长数据转为宽数据,如 acast 以及 dcast。 acast 输出数组,dcast 输出数据框。公式的左边每个变量都会作为结果中的一列,而右边的变量被当成因子类型,每个水平都会在结果中产生一列。 可以采用如下命令将数据还原。

cast 函数的作用除了还原数据外,还可以对数据进行整合,采用 fun.aggregate自定义自己的函数就可以。事实上,melt 函数是为 cast 服务的,目的就是使用 cast 函数对数据进行整理和加工 。

最后,通过以上得到的场均数据来给文章收个尾,作为常规赛MVP的库里场均得分最高,但是助攻较少,这跟勇士队的战术体系有关,勇士由大前锋格林分担了一部分组织的工作;沃尔,保罗和威少在得分的同时拿到了10个左右的助攻数,很好地履行了组织后卫的职责,尤其是威少,要知道整个赛季下来维持场均得分20+助攻10+着实不易;欧文助攻数最少,他是一个天生的杀手,虽然组织确是其弱项,但在詹姆斯身边确实也无需他承担太多串联球队的任务,只要能够犀利地取分就好;最后就是康利了,他的得分和助攻都基本排在末座,但是不妨碍今年夏天拿到NBA史上最大的1.53亿合同,也是没谁了。



 本文来自№→★飞刀的微信公共帐号“数据挖掘与R语言”,用微信添加数据挖掘与R语言公众号,即可订阅。转载必须保留作者、公共帐号信息。

长按识别图中二维码 



 
数据挖掘与R语言 更多文章 R及其拓展包的安装和使用 线性回归与R语言 递归函数浅析 数据类型与数据结构 编写属于你自己的R函数
猜您喜欢 TDD用例拆分的原则和方法 Python基础教程16:元组 Cocos助力锤子科技独立游戏扶持计划 微信支付成功后推荐关注栏规则---20160406最新 推荐!国外程序员整理的 PHP 资源大全