查看: 121|回复: 1

[软件使用] 如何轻松转换成作图所需的表格格式?

[复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
666
注册时间
2020.6.16
在线时间
386 小时

发表于 3 天前 | 显示全部楼层 |阅读模式
将数据整理成作图所需的格式,是完成科研图表绘制的前提。而对于常见的作图数据组织方式主要有两种:宽数据和长数据。

1、宽数据与长数据

宽数据,最常见的数据组织方式,表格的每一列表示一个变量,每一行表示“列变量”对应的观测值(记录)。比如常见的基因表达量表格就是宽数据的格式,如下图。而长数据则是最常见的绘图数据组织方式,表格的前几列一般表示变量分组(分类),而最后一列则对应的数值。


以R语言为例,基础绘图函数常需要将数据整理成宽数据,而ggplot2以及基于ggplot2的一些绘图函数则需要将数据整理成长数据。长数据非常容易将数据与图形属性(如颜色、大小、形状等)建立映射关系。

2、宽数据转为长数据

想要将宽数据轻松转为长数据,主要用到reshape2包的melt函数,下面就以R语言自带的范例数据airquality为例做演示。

  1. #载入reshape2包;
  2. library(reshape2)

  3. #载入R自带范例数据;
  4. dt <- airquality
  5. head(dt,10)
  6. dim(dt)
复制代码



  1. #melt()函数及其常用参数;
  2. melt(data,
  3. id.vars,
  4. measure.vars,
  5. variable.name = "variable",
  6. value.name = "value")
  7. #id.vars:表示不需要合并的列(即保留的列);
  8. #measure.vars:表示需要合并的列;
  9. #variable.name:表示列名合并后的新列名;
  10. #value.name:表示数值合并后的新列名;

  11. #为了方便完整展示数据,这里仅用表格前3行的数据进行演示;
  12. df <- head(dt,3)
  13. df
  14. #将宽数据转成长数据;
  15. df1 <- melt(df,
  16. variable.name = "Var",
  17. value.name = "Value")
  18. #No id variables; using all as measure variables
  19. #由于id.vars和measure.vars参数的省略,这里将所有列进行整合;
  20. head(df1,10)
  21. dim(df1)
  22. #[1] 18 2
复制代码



  1. #选择指定的列,将宽数据转成长数据;
  2. df2 <- melt(df,
  3. measure.vars=c("Ozone","Wind","Temp"),
  4. variable.name = "Var",
  5. value.name = "Value")
  6. df2
复制代码



  1. #选择保留和合并的列,将宽数据转成长数据;
  2. df3 <- melt(df,
  3. id.vars=c("Solar.R"),
  4. measure.vars=c("Ozone","Wind","Temp"),
  5. variable.name = "Var",
  6. value.name = "Value")
  7. df3
复制代码


3、长数据转为宽数据

cast函数下包含:acast or dcast两个函数。前者主要生成 vector/matrix/array,而后者主要生成dataframe。下面主要以上文生成的长数据df2为例,使用dcast()将长数据转成宽数据。
  1. #dcast()函数及其常用参数;
  2. dcast(data,
  3. formula,
  4. value.var = guess_value(data))
  5. #formula:“保留的列”~“拆分的列”;
  6. #value.var:存放数值的列名;

  7. #查看所使用数据;
  8. df2
  9. #将长数据转换成宽数据;
  10. df4 <- dcast(df2,Solar.R+Month+Day~Var,value.var="Value")
  11. df4
复制代码



  1. #尝试丢弃Day变量;
  2. df5 <- dcast(df2,Solar.R+Month~Var,value.var="Value")
  3. df5
复制代码



注意,由于df1只有两列,无法直接使用dcast函数,我们可以使用rep(1:3,6)在df1中再添加一列作为formula波浪线前的变量就可以顺利完成转换了。


好啦,本次的分享就到这里啦!

本文作者:基迪奥-莫北   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!

最近看过此主题的会员

回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2016.10.5
在线时间
43 小时

发表于 昨天 14:27 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表