原文https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html

摘要

在数据分析中,人们将80% 的时间花在清理和准备数据上。数据清理和准备不仅仅是第一步,而是随着新问题的出现或新数据的收集,它必须在分析过程中重复多次进行。为了解决这个问题,本文侧重于数据清理的一个小而重要的方面,我称之为数据整理: 构建数据集以便于分析。

整洁数据的原则提供了一种标准的方式来组织数据集中的数据值。标准使得初始数据清理变得更加容易,因为你不需要从头开始,在每次整理的时候都重新制定原则,发明轮子。整洁的数据标准可以促进数据的初步探索(EDA)和分析,并简化数据分析工具的开发。当前使用的不同的数据工具经常需要多次转换。当你想把数据从一个分析工具中导到另一个工具时,你必须花时间调整数据的输出,这样你才可以把它导入到另一个工具中。整洁的数据集和标准的数据工具应该相一致,这样使数据分析更容易,让人们更能够专注于有趣的领域问题,而不是无趣的数据搬运。

定义整洁数据

Happy families are all alike; every unhappy family is unhappy in its own way — Leo Tolstoy 幸福的家庭都是一样的; 每个不快乐的家庭都以自己的方式不开心 — 列夫·托爾斯泰

像家庭一样,整洁的数据集都是一样的,但是每个糟糕混乱的数据都以自己的方式各不相同。整洁的数据集提供了一种标准化的方式来将数据集的结构 (其物理布局) 与其语义 (其含义) 联系起来。在本节中,我将提供一些标准词汇来描述数据集的结构和语义,然后使用这些定义来明确什么是整洁的数据。

数据结构

大多数统计数据集都是由行和列组成的数据帧。列几乎都有自己的标记,行有时被标记。下面的代码以野外常见的格式提供了一些关于想象实验的数据。该表有两列三行,行和列都有标签。下面提供了一组实验数据(虚拟),是我们常见的一种。数据有2行3列,行和列都做了标记。

name treatmenta treatmentb
John Smith NA 18
Jane Doe 4 1
Mary Johnson 6 7

对于上面的数据,对于上面这些基础数据我们有许多不一样的结构来表示。比如,下面表中的数据与上表一样,但是我们将行和列进行了转置。

treatment John.Smith Jane.Doe Mary.Johnson
a Na 4 6
b 18 1 7

相同的数据,但是布局完全不同。行和列的标记完全不能够说明为什么两个表的数据是一样的。除了表面上的这些,我们需要一种方法来描述表中显示的值的基本语义或含义。

数据语义(Data semantics)

数据集是值的集合,通常是数字 (定量数据quantitative) 或字符串 (定性数据qualitative)。所有的值以两个维度组织。即每个值都属于一个变量(variable)和一个观察(observation)。变量包含所有测量单位之间相同基础属性 (如高度、温度、持续时间) 的值。观察包含在同一单位 (如一个人、一天或种族) 上测量的所有属性值。
怀孕数据的整洁版本如下: (稍后您将了解这些功能是如何工作的)

ID name treatment n
1 Jane Doe a 4
2 Jane Doe b 1
3 John Smith a NA
4 John Smith b 18
5 Mary Johnson a 6
6 Mary Johnson b 7

这样得这些值、变量和观察值更加清晰。数据集包含了3个变量6个观察值和18个值。

  1. name,三个可能的值。
  2. treatment,两个可能的值。
  3. n, 5个或6个值(取决于你对缺失值的看法)

实验设计告诉我们更多关于观察的结构。在这个实验中,每个人和治疗的组合都进行了观察,这是一个完全交叉的设计。实验设计还决定了缺失值是否可以安全丢弃。在这个实验中,缺失的值代表了一个应该进行但没有进行的观察,所以保留它很重要。而有的结构缺失值,代表无法进行的测量 (例如,怀孕男性的计数),可以安全地移除。

对于一个给定的数据集,通常可以很容易地判断什么是观察值,什么是变量。但是总的来说,精确地定义变量和观察值惊人的困难。比如,如果表1里的2列分别是高度和重量,我们就会称它们为变量。如果2列分别是高度和宽度,那区分就不是那么清晰了,因为我们可以认为高度和宽度是某个维度变量的值。如果2列分别是家庭电话和工作电话,我们可以把它们当作两个变量;但是在一个侦查诈骗的分析里,我们可能想要电话号码和号码类别这些变量,因为多人使用同一电话号码可能暗示着诈骗。一个普遍的首要原则是,在变量之间描述功能性的关系较容易(比如,Z与x和y的组合呈线性关系,密度是重量和体积的比),在各行之间描述则较难;在各组观察值之间作比较较容易(比如a组的平均值和b组的平均值作比较),在各列之间比较较难。
在某些分析里,可能有不同层次的观察值。比如在一个新型过敏药物的试验中,我们可能有3个观察的类别:从每个人收集来的人口统计学数据(年龄、性别、人种),从每个人每天收集来的医疗数据(打喷嚏数,是否眼红),以及从每天收集来的气象数据(气温、花粉浓度)。