背景
最近在使用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语言实战》中的图形表示
