5.1 整齐数据

在这一节,我们使用tidyr里的几组数据:tidyr::table1, tidyr::table2, tidyr::table3, tidyr::table4a, tidyr::table4b. 它们的内容都是一样的,但是只有tidyr::table1是整齐的数据。其它几个都是因种种原因而不整齐的数据。

这个数据记录了阿富汗,巴西和中国三个国家,在1999年和2000年这两个年份中,肺结核病例数和总人口数量。在往下看之前,问一下自己,自变量和因变量是什么?

不难理解,国家和年份是自变量,病例数和人口数是因变量。

5.1.1 不整齐的常见问题

在第(tibble-concept)节讲过,“tidy data”的定义很简单:

每一行代表的是一次(且仅一次)observation,每一列代表的是一个(且仅一个)变量。

判断某一列是否是一个变量的方法很简单:问自己,这一列的标题是否直接反映了这一列所含的数据?

判断一行是否是一次observation(观察),首先我们需要清楚自变量是什么。每个自变量的组合和它对应的因变量为一行。

我们看table1:

tidyr::table1
#> # A tibble: 6 x 4
#>   country      year  cases population
#>   <chr>       <int>  <int>      <int>
#> 1 Afghanistan  1999    745   19987071
#> 2 Afghanistan  2000   2666   20595360
#> 3 Brazil       1999  37737  172006362
#> 4 Brazil       2000  80488  174504898
#> 5 China        1999 212258 1272915272
#> 6 China        2000 213766 1280428583

每一列的标题是否直接反映了这一列所含的数据?是的,阿富汗,巴西和中国都是国家;1999, 2000都是年份;745, 2666等都是病例数;19987071, 20595360等都是人口数量。

每一行是否是一次观察?是的,这里的自变量是国家和年份。3个国家,2个年份,共6种组合,每种组合刚好一行。

我们再看table2:

tidyr::table2
#> # A tibble: 12 x 4
#>    country      year type            count
#>    <chr>       <int> <chr>           <int>
#>  1 Afghanistan  1999 cases             745
#>  2 Afghanistan  1999 population   19987071
#>  3 Afghanistan  2000 cases            2666
#>  4 Afghanistan  2000 population   20595360
#>  5 Brazil       1999 cases           37737
#>  6 Brazil       1999 population  172006362
#>  7 Brazil       2000 cases           80488
#>  8 Brazil       2000 population  174504898
#>  9 China        1999 cases          212258
#> 10 China        1999 population 1272915272
#> 11 China        2000 cases          213766
#> 12 China        2000 population 1280428583

每个自变量之组合出现了两次(比如有两次China+1999),且有一列意义不明(名称和数据的关联不直接):把casespopulation各称作一个“type”并不合适,它们俩自身显然就可以作为一个变量名。

再看table4atable4b

tidyr::table4a; tidyr::table4b
#> # A tibble: 3 x 3
#>   country     `1999` `2000`
#> * <chr>        <int>  <int>
#> 1 Afghanistan    745   2666
#> 2 Brazil       37737  80488
#> 3 China       212258 213766
#> # A tibble: 3 x 3
#>   country         `1999`     `2000`
#> * <chr>            <int>      <int>
#> 1 Afghanistan   19987071   20595360
#> 2 Brazil       172006362  174504898
#> 3 China       1272915272 1280428583

它是数据分成了两组,病例数和人口。它们的变量命名很糟糕:745, 37737212258分别都是一个“1999”吗?显然用年份作为变量名很不合适。

tidyr::table3; tidyr::table5
#> # A tibble: 6 x 3
#>   country      year rate             
#> * <chr>       <int> <chr>            
#> 1 Afghanistan  1999 745/19987071     
#> 2 Afghanistan  2000 2666/20595360    
#> 3 Brazil       1999 37737/172006362  
#> 4 Brazil       2000 80488/174504898  
#> 5 China        1999 212258/1272915272
#> 6 China        2000 213766/1280428583
#> # A tibble: 6 x 4
#>   country     century year  rate             
#> * <chr>       <chr>   <chr> <chr>            
#> 1 Afghanistan 19      99    745/19987071     
#> 2 Afghanistan 20      00    2666/20595360    
#> 3 Brazil      19      99    37737/172006362  
#> 4 Brazil      20      00    80488/174504898  
#> 5 China       19      99    212258/1272915272
#> 6 China       20      00    213766/1280428583

table3table5的问题不大,只是对元数据进行了一些处理。在下面会介绍方法把它们转换成像table1那样,整齐且通用性强的数据。

5.1.2 解决方案