2.4.1 什么是整洁数据?
采用 Hadley 的表述,脏的 / 不整洁的数据往往具有如下特点:
- 首行(列名)是值,不是变量名
- 多个变量放在一列
- 变量既放在行也放在列
- 多种类型的观测单元在同一个单元格
- 一个观测单元放在多个表
而整洁数据具有如下特点:
- 每个 变量 构成一列
- 每个 观测 构成一行
- 每个观测的每个变量 值 构成一个单元格
tidyverse 系列包中的函数操作的都是这种整洁数据框,而不整洁数据,首先需要变成整洁数据,这就是 数据重塑 。
数据重塑主要包括长宽表转化、拆分 / 合并列。长宽表转化最初是 reshape2
包的 melt()
和 cast()
; 后来又发展到早期 tidyr 包的 gather()
和 spread()
, 现在 tidyr 1.0 之后提供了更加易用的 pivot_longer()
和 pivot_wider()
.
先看一个不整洁数据与整洁数据对比的例子:
dt = tribble(
~observation, ~A_count, ~B_count, ~A_dbh, ~B_dbh,
"Richmond(Sam)", 7, 2, 100, 110,
"Windsor(Ash)", 10, 5, 80, 87,
"Bilpin(Jules)", 5, 8, 95, 90
)
knitr::kable(dt, align="c")
该数据框不整洁,表现在:
observation
列有两个变量数据- 列名中的
A/B
应是分类变量species
的两个水平值 - 测量值列
count
和dbh
应各占 1 列,而不是 2 列
下面借助 tidyr 包中数据重塑函数,将其变成整洁数据,读者可以学完本节内容再回头看这段代码:
tidy_dt = dt %>%
pivot_longer(-observation,
names_to = c("speices", ".value"),
names_sep = "_") %>%
separate(observation, into = c("site", "surveyor"))
knitr::kable(tidy_dt, align = "c")
这里的关键是,要学会区分哪些是 变量 、 观测 、 值 。
2.4.2 宽表变长表
宽表的特点是:表比较宽,本来该是 "值 ” 的,却出现在 "变量(名) ” 中。
这就需要给它变到 "值 ” 中,新起个列名存为一列,这就是所谓的宽表变长表。
1. 每一行只有 1 个观测的