查看原文
其他

如何使用reshape/reshape2使劲揉你的数据

2017-07-23 鲁伟 R语言中文社区

作者:鲁伟

一个数据科学践行者的学习日记。数据挖掘与机器学习,R与Python,理论与实践并行。个人公众号:数据科学家养成记 (微信ID:louwill12)

想必各位之前对 Hadley Wickham 大神都有所耳闻了。名声遐迩的ggplot2就是Hadley大神一手开发的,当然大神还很多产,除了ggplot2,还写了plyr、dplyr以及本文要说的reshape/reshape2包。作为Rstudio的首席科学家,让我们在学习reshape包之前膜拜一下Hadley大神:

reshape/reshape2包提供了一套数据重构和整合的工具。功能看起来类似excel中的数据透视表,但其间数据形式的千变万化仅靠两个核心函数melt和cast即可实现。在开发出reshape包5年之后,大神对原来的代码进行了重构重新发布了reshape2包,二者在本质上并无差异,相较于reshape包,reshape2的特性在于:

  • 用dcast和acast函数代替了原先的cast函数

  • 可以用变量名来设定边际参数

  • 删除了cast函数的一些功能,dplyr包可以在这些函数上表现更好

  • 对melt函数族增加了缺失值处理参数

  • reshape2计算效能更加快速

reshape包

用R语言实战一书中的一个简单的例子来看reshape的两个核心函数melt和cast的功能。melt表示对原始数据进行融合,将其重构为这样一种数据格式:每个测量变量独占一行,且行中要带有唯一识别这个测量所需的变量标识符。

cast函数读取melt过后的数据,并使用公式将其重塑为任何你想要的数据。其调用方式为:

newdata<-cast(mdata,formula,FUN)

其中mdata为已融合过的数据,formula为重塑公式,FUN为数据整合函数。formula接受的公式格式如下:

rowvar1+rowvar2+...~colvar1+colvar2+...

rowvar1+rowvar2+...为选取的行标识变量,colvar1+colvar2+...为选取的列测量变量。

且看例子:

library(reshape)
#原始数据
mydata<-data.frame(id=c(1,1,2,2),time=c(1,2,1,2),
X1=c(5,3,6,2),X2=c(6,5,1,4))
#melt进行数据融合
md<-melt(mydata,id=(c("id","time")))
md
 id time variable value
1  1    1       X1     5
2  1    2       X1     3
3  2    1       X1     6
4  2    2       X1     2
5  1    1       X2     6
6  1    2       X2     5
7  2    1       X2     1
8  2    2       X2     4
#cast进行数据重铸
#执行整合
cast(md,id~variable,mean)
 id X1  X2
1  1  4 5.5
2  2  4 2.5
cast(md,time~variable,mean)
 time  X1  X2
1    1 5.5 3.5
2    2 2.5 4.5
cast(md,id~time,mean)
 id   1 2
1  1 5.5 4
2  2 3.5 3
#不执行整合
cast(md,id+time~variable)
id time X1 X2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
cast(md,id+variable~time)
 id variable 1 2
1  1       X1 5 3
2  1       X2 6 5
3  2       X1 6 2
4  2       X2 1 4
cast(md,id~variable+time)
 id X1_1 X1_2 X2_1 X2_2
1  1    5    3    6    5
2  2    6    2    1    4

该数据的融合重铸过程如图所示:(图片来自于R语言实战)


reshape2

reshape2核心功能和reshape基本一样,小编简单地拿个NBA球员数据揉一下。且看代码:

nbadata<-read.csv("D:/Rdata/datasets/NBAstats.csv")
library(reshape2)
#melt进行数据融合
nd<-melt(nbadata,id=c("Players","Teams"))
head(nd)
           Players                 Teams variable value
1 Russell Westbrook Oklahoma City Thunder   Points  31.1
2      Kyrie Irving   Cleveland Cavaliers   Points  25.7
3      James Harden       Houston Rockets   Points  29.2
4      LeBron James   Cleveland Cavaliers   Points  25.9
5      Kevin Durant Golden State Warriors   Points  25.8
6        Chris Paul       Houston Rockets   Points  23.4
#执行整合
#还原为原始数据
dcast(nd,Players+Teams~variable)
         Players      Teams Points Rebounds Assists Steals
1        Chris Paul       Houston Rockets   23.4      3.6     9.2    1.8
2      James Harden       Houston Rockets   29.2      8.3    11.3    1.4
3      Kevin Durant Golden State Warriors   25.8      8.3     4.9    1.1
4      Kyrie Irving   Cleveland Cavaliers   25.7      4.1     4.3    1.3
5      LeBron James   Cleveland Cavaliers   25.9      7.7     8.8    1.4
6       Paul George Oklahoma City Thunder   22.3      6.2     3.3    1.5
7 Russell Westbrook Oklahoma City Thunder   31.1     10.5    10.1    1.6
8     Stephen Curry Golden State Warriors   25.6      4.1     6.8    1.3
dcast(nd,Players~variable,mean)
           Players Points Rebounds Assists Steals
1        Chris Paul   23.4      3.6     9.2    1.8
2      James Harden   29.2      8.3    11.3    1.4
3      Kevin Durant   25.8      8.3     4.9    1.1
4      Kyrie Irving   25.7      4.1     4.3    1.3
5      LeBron James   25.9      7.7     8.8    1.4
6       Paul George   22.3      6.2     3.3    1.5
7 Russell Westbrook   31.1     10.5    10.1    1.6
8     Stephen Curry   25.6      4.1     6.8    1.3
dcast(nd,Teams~variable,sum)
                 Teams Points Rebounds Assists Steals
1   Cleveland Cavaliers   51.6     11.8    13.1    2.7
2 Golden State Warriors   51.4     12.4    11.7    2.4
3       Houston Rockets   52.6     11.9    20.5    3.2
4 Oklahoma City Thunder   53.4     16.7    13.4    3.1
dcast(nd,Players~Teams,sum)
           Players Cleveland Cavaliers Golden State Warriors
1        Chris Paul                 0.0                   0.0
2      James Harden                 0.0                   0.0
3      Kevin Durant                 0.0                  40.1
4      Kyrie Irving                35.4                   0.0
5      LeBron James                43.8                   0.0
6       Paul George                 0.0                   0.0
7 Russell Westbrook                 0.0                   0.0
8     Stephen Curry                 0.0                  37.8
 Houston Rockets Oklahoma City Thunder
1            38.0                   0.0
2            50.2                   0.0
3             0.0                   0.0
4             0.0                   0.0
5             0.0                   0.0
6             0.0                  33.3
7             0.0                  53.3
8             0.0                   0.0

reshape/reshape2包并不复杂,核心函数只需要掌握melt和cast/dcast/acast即可。大家在熟悉了R数据处理之后,基本就可以根据自己的想法自行去揉数据了。


微信回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存