背景

最近在使用ggplot2绘制图像时,发现ggplot2对于数据的格式要求极为严格,对于不规则的数据进行转换十分头疼。经过一番研究发现一些函数可以简化数据的整形过程,收集如下:

数据的拆分与合并

ggplot2的输入数据需要是data.frame的形式,因此需要将list等进行融合整形,此时使用reshape2包的melt()函数进行操作就比较方便,此外还有几个相似功能的函数,具体使用如下:

reshape2

melt()—把宽格式数据转化成长格式

cast()—把长格式数据转化成宽格式【其中dcast()输出时返回一个数据框,acast()输出时返回一个向量/矩阵/数组】

具体用法

  1. mydata
  1. ## ID Time X1 X2
  2. ## 1 NA 1 5 NA
  3. ## 2 1 2 3 5
  4. ## 3 2 NA NA 1
  5. ## 4 2 1 2 4
  1. md <- melt(mydata, id=c("ID","Time")) # 等同于md <- melt(mydata, id=1:2)
  2. md #固定id,融合其他列
  1. ## ID Time variable value
  2. ## 1 NA 1 X1 5
  3. ## 2 1 2 X1 3
  4. ## 3 2 NA X1 NA
  5. ## 4 2 1 X1 2
  6. ## 5 NA 1 X2 NA
  7. ## 6 1 2 X2 5
  8. ## 7 2 NA X2 1
  9. ## 8 2 1 X2 4

其实是固定id两列,将其他变量通过”variable”和”value”揉合在一起,结果产生了新的两列,一列是变量variable,指代是哪个揉合变量,另外一列是取值value,即变量对应的值

  1. newmd<- dcast(md, ID~variable, mean)
  2. newmd
  1. ## ID X1 X2
  2. ## 1 1 3 5.0
  3. ## 2 2 NA 2.5
  4. ## 3 NA 5 NA
  1. acast(md, ID~variable, mean)
  1. ## X1 X2
  2. ## 1 3 5.0
  3. ## 2 NA 2.5
  4. ## NA 5 NA
  1. acast(md, ID~Time~variable)
  1. ## , , X1
  2. ##
  3. ## 1 2 NA
  4. ## 1 NA 3 NA
  5. ## 2 2 NA NA
  6. ## NA 5 NA NA
  7. ##
  8. ## , , X2
  9. ##
  10. ## 1 2 NA
  11. ## 1 NA 5 NA
  12. ## 2 4 NA 1
  13. ## NA NA NA NA

cast()函数处理的对象应该是melt()函数的结果

其他函数

tidyr包

gather()—-把宽度较大的数据转换成一个更长的形式,它类比于从reshape2包中melt()函数的功能

spread()—-把长的数据转换成一个更宽的形式,它类比于从reshape2包中cast()函数的功能

data.table包

data.table包中的melt()dcast()reshape2包里同名函数的扩展

总结

数据拆分和合并的关系可以用《R语言实战》中的图形表示
reshape.png