本文翻译自外文博客,原文链接:
https://seananderson.ca/2013/10/19/reshape/
- R语言 - 入门环境Rstudio
- R语言 - 基础概念和矩阵操作
一、reshape2 简介
reshape2
是由Hadley Wickham编写的R包,可以轻松地在宽格式(wide-format)和长格式(long-format)之间转换数据。
reshape2
R包主要有两个主要的功能:melt
和cast
melt
:将wide-format数据“熔化”成long-format数据;cast
:获取long-format数据“重铸”成wide-format数据。
这两个命名十分形象,方便记忆,你可以想象成你在处理金属。当你熔化金属成液体滴下时,金属会被拉长(long-format)。如果你把金属它铸成一个模子,它就会变宽(wide-format)。
二、什么是宽表格和长表格
示例数据说明:例子使用内置于R中的空气质量数据集(airquality
)。
每个变量单独成一列的为宽数据,例如:
代码语言:javascript复制## ozone wind temp
## 1 23.61538 11.622581 65.54839
## 2 29.44444 10.266667 79.10000
## 3 59.11538 8.941935 83.90323
## 4 59.96154 8.793548 83.96774
而长数据中变量的ID没有单独列成一列,而是整合在同一列。
长数据矩阵中一列代表变量类型,另外一列表示对用的变量值。例如:
代码语言:javascript复制## variable value
## 1 ozone 23.615385
## 2 ozone 29.444444
## 3 ozone 59.115385
## 4 ozone 59.961538
## 5 wind 11.622581
## 6 wind 10.266667
## 7 wind 8.941935
## 8 wind 8.793548
## 9 temp 65.548387
## 10 temp 79.100000
## 11 temp 83.903226
## 12 temp 83.967742
这并不表示长数据只有两列,比如我们会记录下每个月每天每个空气指标的值,而每个月的天数不一定相等,所以就会出现第三列记录日期。
一般我们实验记录的数据格式(大多习惯用宽表格记录数据)和我们后期用R绘图所用到的数据格式往往不一样,例如ggplot2
、plyr
,还有大多数建模函数lm()
、glm()
、gam()
等经常会使用长表格数据来作图,这时用reshape2
包来转换实验记录的宽表格数据会十分方便。
Wide- to long-format data: the melt function
例子使用内置于R中的空气质量数据集(airquality
)。首先,我们将列名更改为小写方便使用。然后查看一下数据:
names(airquality) <- tolower(names(airquality))
head(airquality)
代码语言:javascript复制## ozone solar.r wind temp month day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
如果我们使用所有默认参数运行melt
会发生什么呢?
library(reshape2) # 首先加载一下reshape2包
aql <- melt(airquality) # 命名取首字母:[a]ir [q]uality [l]ong format
head(aql) # 查看数据前6列
tail(aql) # 查看数据后6列
每一步返回的结果:
代码语言:javascript复制## No id variables; using all as measure variables
## head(aql)
## variable value
## 1 ozone 41
## 2 ozone 36
## 3 ozone 12
## 4 ozone 18
## 5 ozone NA
## 6 ozone 28
## tail(aql)
## variable value
## 913 day 25
## 914 day 26
## 915 day 27
## 916 day 28
## 917 day 29
## 918 day 30
默认情况下melt
会认为全部为数值的每一列都是带有变量的值,包括月份和日期,都合并在了一起,标题行置于variable
列,数值置于value
列。但是有的时候我们想知道每月里面每一天空气指标臭氧、太阳、风和温度的值,这个时候我们可以设置id.vars=c("")
来去除指定的列,只将其他数据做变形。
aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)
代码语言:javascript复制## month day variable value
## 1 5 1 ozone 41
## 2 5 2 ozone 36
## 3 5 3 ozone 12
## 4 5 4 ozone 18
## 5 5 5 ozone NA
## 6 5 6 ozone 28
如果我们想控制长数据中的列名怎么办呢?
代码语言:javascript复制aql <- melt(airquality, id.vars = c("month", "day"),
variable.name = "climate_variable",
value.name = "climate_value")
head(aql)
代码语言:javascript复制## month day climate_variable climate_value
## 1 5 1 ozone 41
## 2 5 2 ozone 36
## 3 5 3 ozone 12
## 4 5 4 ozone 18
## 5 5 5 ozone NA
## 6 5 6 ozone 28
Long- to wide-format data: the cast functions
首先使用dcast
函数将上面转换后的宽数据转换成长数据。用month day ~ variable
告诉dcast
月份和日期是变量,转换成的长数据与原始数据除了变量列的序号不一样,其他都一致。
aql <- melt(airquality, id.vars = c("month", "day"))
aqw <- dcast(aql, month day ~ variable)
head(aqw)
head(airquality) # original data
代码语言:javascript复制## month day ozone solar.r wind temp
## 1 5 1 41 190 7.4 67
## 2 5 2 36 118 8.0 72
## 3 5 3 12 149 12.6 74
## 4 5 4 18 313 11.5 62
## 5 5 5 NA NA 14.3 56
## 6 5 6 28 NA 14.9 66
## original data
## ozone solar.r wind temp month day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
如果你还不明白上面发生了什么,下面我们使用一张图解来展示:
蓝色
阴影表示我们想要表示的各个行的ID
变量,红色
表示想要转换成列名
的变量名
,灰色
表示要在单元格中填充的数据
。
易错点
当每个单元格有多个值时(比如我们想以月而不是天来查看空气指标值,而每个月有多个数据),我们可能会犯一个错。
下面来一个错误示范,这次我们不再将day
作为变量:
dcast(aql, month ~ variable)
代码语言:javascript复制## month ozone solar.r wind temp
## 1 5 31 31 31 31
## 2 6 30 30 30 30
## 3 7 31 31 31 31
## 4 8 31 31 31 31
## 5 9 30 30 30 30
当我们在R运行上面的命令时,会返回一条提示信息:
代码语言:javascript复制## Aggregation function missing: defaulting to length
查看输出数据时发现,每个单元格填充的数据为每个月的记录天数,并非每个测量指标值。当我们转换数据并且每个单元格有多个值时,还需要使用fun.aggregate=
告知dcast
以什么方式重新组合数据,是平均值(mean
)、中位数(median
)还是总和(sum
)。
下面我们试试以平均值来重新组合数据,并使用参数na.rm=TRUE
来删除空值NA。
dcast(aql, month ~ variable, fun.aggregate = mean,
na.rm = TRUE)
代码语言:javascript复制## month ozone solar.r wind temp
## 1 5 23.61538 181.2963 11.622581 65.54839
## 2 6 29.44444 190.1667 10.266667 79.10000
## 3 7 59.11538 216.4839 8.941935 83.90323
## 4 8 59.96154 171.8571 8.793548 83.96774
## 5 9 31.44828 167.4333 10.180000 76.90000
help
- 阅读帮助文档:help(package=”reshape2”)
- 查看
reshape2
官方网站:http://had.co.nz/reshape/ - 帮助视频:http://had.co.nz/reshape/french-fries-demo.html
注:视频为.mov
格式,可以用QuickTime打开观看
R统计和作图
- Graphpad,经典绘图工具初学初探
- 维恩(Venn)图绘制工具大全 (在线 R包)
- 在R中赞扬下努力工作的你,奖励一份CheatShet
- 别人的电子书,你的电子书,都在bookdown
- R语言 - 入门环境Rstudio
- R语言 - 热图绘制 (heatmap)
- R语言 - 基础概念和矩阵操作
- R语言 - 热图简化
- R语言 - 热图美化
- R语言 - 线图绘制
- R语言 - 线图一步法
- R语言 - 箱线图(小提琴图、抖动图、区域散点图)
- R语言 - 箱线图一步法
- R语言 - 火山图
- R语言 - 富集分析泡泡图
- R语言 - 散点图绘制
- R语言 - 韦恩图
- R语言 - 柱状图
- R语言 - 图形设置中英字体
- R语言 - 非参数法生存分析
- R语言 - 绘制seq logo图
- WGCNA分析,简单全面的最新教程
- psych igraph:共表达网络构建
- 一文学会网络分析——Co-occurrence网络图在R中的实现
- 一文看懂PCA主成分分析
- 富集分析DotPlot,可以服
- 基因共表达聚类分析和可视化
- R中1010个热图绘制方法
- 还在用PCA降维?快学学大牛最爱的t-SNE算法吧, 附Python/R代码
- 一个函数抓取代谢组学权威数据库HMDB的所有表格数据
- 文章用图的修改和排版
- network3D: 交互式桑基图
- network3D 交互式网络生成
- Seq logo 在线绘制工具——Weblogo
- 生物AI插图素材获取和拼装指导
- ggplot2高效实用指南 (可视化脚本、工具、套路、配色)
- 图像处理R包magick学习笔记
- SOM基因表达聚类分析初探
- 利用gganimate可视化全球范围R-Ladies(R社区性别多样性组织)发展情况
- 一分钟绘制磷脂双分子层:AI零基础入门和基本图形绘制
- AI科研绘图(二):模式图的基本画法
- 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗?
- R语言可视化学习笔记之ggridges包
- 利用ComplexHeatmap绘制热图(一)
- ggplot2学习笔记之图形排列
- 用R在地图上绘制网络图的三种方法
- PCA主成分分析实战和可视化 附R代码和测试数据
- iTOL快速绘制颜值最高的进化树!
- 12个ggplot2扩展包帮你实现更强大的可视化
- 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出
- R语言统计入门课程推荐——生物科学中的数据分析Data Analysis for the Life Sciences
- 数据可视化基本套路总结
- 你知道R中的赋值符号箭头
<-
和等号=
的区别吗? - 使用dplyr进行数据操作30例
- 交集intersect、并集union、找不同setdiff
- R包reshape2,轻松实现长、宽数据表格转换
- 1数据类型(向量、数组、矩阵、 列表和数据框)
- 2读写数据所需的主要函数、与外部环境交互
- 3数据筛选——提取对象的子集
- 4向量、矩阵的数学运算
- 5控制结构
- 6函数及作用域
- 7认识循环函数lapply和sapply
- 8分解数据框split和查看对象str
- 9模拟—随机数、抽样、线性模型
- 1初识ggplot2绘制几何对象
- 2图层的使用—基础、加标签、注释
- 3工具箱—误差线、加权数、展示数据分布
- 4语法基础
- 5通过图层构建图像
- 6标度、轴和图例
- 7定位-分面和坐标系
- 8主题设置、存储导出
- 9绘图需要的数据整理技术
- 创建属于自己的调色板
- 28个实用绘图包,总有几个适合你
- 热图绘制
- R做线性回归
- 绘图相关系数矩阵corrplot
- 相关矩阵可视化ggcorrplot
- 绘制交互式图形recharts
- 交互式可视化CanvasXpress
- 聚类分析factoextra
- LDA分析、作图及添加置信-ggord
- 解决散点图样品标签重叠ggrepel
- 添加P值或显著性标记ggpubr
- Alpha多样性稀释曲线rarefraction curve
- 堆叠柱状图各成分连线画法:突出组间变化
- 冲击图展示组间时间序列变化ggalluvial
- 桑基图riverplot
- 微生物环境因子分析ggvegan
- 五彩进化树与热图更配ggtree
- 多元回归树分析mvpart
- 随机森林randomForest 分类Classification 回归Regression
- 加权基因共表达网络分析WGCNA
- circlize包绘制circos-plot
- R语言搭建炫酷的线上博客系统
- 28个实用绘图包,总有几个适合你
- 热图绘制
- R做线性回归
- 绘图相关系数矩阵corrplot
- 相关矩阵可视化ggcorrplot
- 绘制交互式图形recharts
- 交互式可视化CanvasXpress
- 聚类分析factoextra
- LDA分析、作图及添加置信-ggord
- 解决散点图样品标签重叠ggrepel
- 添加P值或显著性标记ggpubr
- Alpha多样性稀释曲线rarefraction curve
- 堆叠柱状图各成分连线画法:突出组间变化
- 冲击图展示组间时间序列变化ggalluvial
- 桑基图riverplot
- 微生物环境因子分析ggvegan
- 五彩进化树与热图更配ggtree
- 多元回归树分析mvpart
- 随机森林randomForest 分类Classification 回归Regression
- 加权基因共表达网络分析WGCNA
- circlize包绘制circos-plot
- R语言搭建炫酷的线上博客系统
- 维恩(Venn)图绘制工具大全 (在线 R包)
- R包circlize:柱状图用腻了?试试好看的弦状图
- 获取pheatmap聚类后和标准化后的结果
- 一个震撼的交互型3D可视化R包 - 可直接转ggplot2图为3D
- 赠你一只金色的眼 - 富集分析和表达数据可视化
- 是Excel的图,不!是R的图
- 道友,来Rstudio里面看动画了
- 用了这么多年的PCA可视化竟然是错的!!!
- R语言可视化学习笔记之ggridges包
- 万能转换:R图和统计表转成发表级的Word、PPT、Excel、HTML、Latex、矢量图