如何使用reshape/reshape2使劲揉你的数据
作者:鲁伟
一个数据科学践行者的学习日记。数据挖掘与机器学习,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机器学习入门