背景
最近在使用ggplot2绘制图像时,发现ggplot2对于数据的格式要求极为严格,对于不规则的数据进行转换十分头疼。经过一番研究发现一些函数可以简化数据的整形过程,收集如下:
数据的拆分与合并
ggplot2的输入数据需要是data.frame的形式,因此需要将list等进行融合整形,此时使用reshape2包的melt()
函数进行操作就比较方便,此外还有几个相似功能的函数,具体使用如下:
reshape2
melt()
—把宽格式数据转化成长格式
cast()
—把长格式数据转化成宽格式【其中dcast()
输出时返回一个数据框,acast()
输出时返回一个向量/矩阵/数组】
具体用法
mydata
## ID Time X1 X2
## 1 NA 1 5 NA
## 2 1 2 3 5
## 3 2 NA NA 1
## 4 2 1 2 4
md <- melt(mydata, id=c("ID","Time")) # 等同于md <- melt(mydata, id=1:2)
md #固定id,融合其他列
## ID Time variable value
## 1 NA 1 X1 5
## 2 1 2 X1 3
## 3 2 NA X1 NA
## 4 2 1 X1 2
## 5 NA 1 X2 NA
## 6 1 2 X2 5
## 7 2 NA X2 1
## 8 2 1 X2 4
其实是固定id两列,将其他变量通过”variable”和”value”揉合在一起,结果产生了新的两列,一列是变量variable,指代是哪个揉合变量,另外一列是取值value,即变量对应的值
newmd<- dcast(md, ID~variable, mean)
newmd
## ID X1 X2
## 1 1 3 5.0
## 2 2 NA 2.5
## 3 NA 5 NA
acast(md, ID~variable, mean)
## X1 X2
## 1 3 5.0
## 2 NA 2.5
## NA 5 NA
acast(md, ID~Time~variable)
## , , X1
##
## 1 2 NA
## 1 NA 3 NA
## 2 2 NA NA
## NA 5 NA NA
##
## , , X2
##
## 1 2 NA
## 1 NA 5 NA
## 2 4 NA 1
## NA NA NA NA
cast()
函数处理的对象应该是melt()
函数的结果
其他函数
tidyr包
gather()
—-把宽度较大的数据转换成一个更长的形式,它类比于从reshape2包中melt()
函数的功能
spread()
—-把长的数据转换成一个更宽的形式,它类比于从reshape2包中cast()
函数的功能
data.table包
data.table
包中的melt()
和dcast()
是reshape2
包里同名函数的扩展
总结
数据拆分和合并的关系可以用《R语言实战》中的图形表示