4.1.2 数据整形的典型方式
在真实的数据集中,通常有以下5种典型方式不满足整洁数据的3个要求,具体情形及处理说明如下。
1.列标题是变量值,而非变量名
在这种格式的数据集中,变量既构成列,又构成行,列标题是变量值,而不是变量名,示例如表4-1所示。虽然这样的数据集格式不满足整洁数据的要求,但在某些情况下可能非常有用,如它可以为交叉设计提供有效存储等。处理这类数据集,我们需要对其进行融合或堆叠,简单来说,就是我们需要把列转换为行。融合指的是通过变量列进行参数化,将其他列转化为两个变量,一列包含重复的列标题,一列包含变量值。对表4-1进行融合的结果如表4-3所示。
2.多个变量存储在一列中
对于一些数据集,融合后列变量名可能变为多个变量名的组合。以国际卫生组织按照国家、性别、年龄记录的2000年的确诊肺结核的部分病例数据为原始数据集,如表4-4所示。其中,性别用M/F表示,年龄按0~14岁、15~24岁、25~34岁等年龄段划分。
表4-4 原始数据集一
对表4-4进行融合操作,得到的结果如表4-5所示。
表4-5 对表4-4进行融合后的数据
从表4-5可以看到,Column列中既包含性别变量,又包含年龄变量。我们需要对含有多个变量的Column列进行分割,得到的整洁数据如表4-6所示。
表4-6 对表4-5进行处理后的整洁数据
3.变量既在列中存储,又在行中存储
当变量既存储在行中又存储在列中时,往往会出现复杂的混乱数据。表4-7节选自全球历史气象网的墨西哥气象站2010年5个月的每日天气数据。该数据集的element列存储的是最高和最低气温(tmax、tmin),同时,D1-D31列存储的是每月第1天到第31天的气温,存在变量既在列中存储,又在行中存储的混乱情况。对这样的数据集,需要先按照单独的列(Id、year、month)和含有变量的列(element)对数据集进行融合。融合后的结果如表4-8所示,为了展示结果,此处省略缺失值。
表4-7 原始数据集二(部分)
表4-8 对表4-7进行融合后的数据(部分)
由表4-8可知,element列有多个变量,因此还需要对上述数据进行重铸或拆分,即将element变量转出为列,结果如表4-9所示。
表4-9 对表4-8进行处理后的整洁数据
4.多种观察单元存储在同一表中
在收集数据时,通常不仅仅只关注一个变量,往往会收集包含多个变量的多类型观察单元值。整洁数据要求每一类观察单元值存储在自己的表中,这与数据库的规范化要求一致,即每个事实只在一处表述,避免出现数据冗余不一致的情况。
表4-10节选自2000年billboard上榜榜单,包括歌手名称、歌曲、上榜日期、周排名等。实际上,这个数据集中包含两类观察单元:歌曲和排名。因此这个数据集需要被拆分为两个数据表:一个是存储歌曲的数据表;另一个存储排名的数据表。两个表需要有一个关键词(Id),以便后续的合并等操作。
存储歌曲的数据表、存储排名的数据表分别如表4-11、表4-12所示。表4-11、表4-12中的数据格式能够有效解决数据不一致的问题,但在实际分析中,能够直接处理关系型数据的工具非常少,因此,如果需要分析数据,还需要对数据进行整合,通过两个表中相同的关键字进行合并即可。
表4-10 原始数据集三
表4-11 存储歌曲的数据表
表4-12 存储排名的数据表
5.一个观察单元存储在多个表中
同一个观察单元存储在多个表中的情况也比较常见,这些表格或文件常被另外的变量分开,例如,记录气温数据可以按照年份分开记录,每年记录一个数据表。这种类型的数据只要格式一致,便可以依照以下几个步骤进行处理:首先,将每个文件读取为一个表格;其次,为每个表格增加一列原始文件名作为唯一标识;最后,将所有表格合并即可得到一个符合要求的整洁数据。