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
),且有一列意义不明(名称和数据的关联不直接):把cases
和population
各称作一个“type”并不合适,它们俩自身显然就可以作为一个变量名。
再看table4a
和table4b
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
, 37737
和212258
分别都是一个“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
table3
和table5
的问题不大,只是对元数据进行了一些处理。在下面会介绍方法把它们转换成像table1
那样,整齐且通用性强的数据。