6.1 Tidy data

“Happy families are all alike; every unhappy family is unhappy in its own way.” –– Leo Tolstoy
“Tidy datasets are all alike, but every messy dataset is messy in its own way.” –– Hadley Wickham

整洁数据 (Tidy data) 是进行数据操作和 ggplot2 可视化的基础,所谓数据整理(清洗、清理),就是把 messy data 转换为 tidy data 的过程。在 tidyverse 生态中,tidyr 负责数据的整理和变型:

如果一个数据集是整洁的,需要满足以下三个要素:
1. 每个变量有一个专属列 (Each variable must have its own column)
2. 每个观测有一个专属行 (Each observation must have its own row)
3. 每个值有一个专属的存储单元 (Each value must its own cell)

这三条规则是互相关联的,不可能只满足三条规则中的两条,所以我们可以更简化地把清洁数据的要求写成:
1. 每列是一个变量(Variables go in columns)
2. 每行是一个观测(Observatiosn go in rows)

同样的数据可以有不同的表现形式,但只有满足整洁数据的三个条件的数据集才是最容易使用的。以下的 3 个数据集背后的均来自1999年和2000年世界卫生组织在阿富汗、巴西和中国的一次肺结核病例调查,都有 countryyearcasespopulation四个变量,但采用了不同的组织方式:

table4atable4b分别是以 cases 和 population 为值的数据透视表:

在上面的例子中,只有table1 符合清洁数据的标准。在table2 中,type不是一个变量,它的值 casespopulation 才是变量,进而导致了每一行不是一个完整的观测。在 table3 中,rate 同样不是一个变量,casespopulation 的值被挤在了一个单元里。至于 table4atable4b19992000不是变量,而是一个表示年份的变量的值。

为什么要为获得清洁的数据如此大费周折呢?主要有两个优点:

  1. 清洁数据的规则使得我们可以遵从一个一致、明确的结构存储数据。学习处理这些数据的工具变得很容易,因为你的对象在底层是一致的。
  2. 把变量存储在列中可以把 R 的向量化函数优势发挥到极致。例如 mutate()summarize() ,许多内置的 R 函数都是对向量进行操作的。只要有了清洁的数据,后面的数据变换工作就很容易:

6.1.1 Exercises

Exercise 6.1 table2 计算发病率 (rate = cases / population), 需要进行以下四步操作: * 得到每个国家每年的cases
* 得到每个国家每年的population
* 计算 rate = cases / population
* 把算好的数据存储到正确的位置

首先,分别对 casespopulation建立一张表,并且确保两张表的排列顺序相同:

计算 rate