Пакет tidyr

Данные зачастую бывают не в том виде, в котором нам нужно. Мы уже преобразовывали данные с помощью пакета dplyr, а теперь познакомися с пакетом tidyr. Подгрузим уже известные нам пакеты и пакет tydir.

Внутри пакета tidyr встроены некоторые небольшие датасеты. Можно вызвать справку по этим наборам данных с помощью команды ?table1. В этих наборах данных показано число случаев заболевания туберкулезом, зарегистрированных всемирной организацией здравоохранения в Афганистане, Бразилии и Китае в период с 1999 по 2000 годы. Переменная cases показывает количество случаев, а переменная population численность населения.

Давайте посмотрим на эти наборы данных и разберёмся, что с ними не так.

В наборе данных table2 переменная type содержит cases или population, а в переменной count соотвествующее значени. Так получается, что в переменной находятся другие переменные.

## # 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

В наборе данных table3 перtменная rate содержит две переменные, разделенные через слэш.

## # 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

В наборах данных table4a и 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

В наборах данных table5 есть две переменные century и year, хотя хотелось бы иметь одну переменную.

## # 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

Набор данных 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

Фунция gather

В наборе данных table4a каждый год это отдельная переменная. Хотя год должен быть одной перменной. Привести набор данных к нужному виду поможет функция gather.

Функция gather имеет 4 аргумента:

  • df – дата фрейм
  • key – название нового столбца ключей
  • value – название нового столбца значений
  • ... – название столбцов, которые должны быть задействованы или наоборот не задействованы

Используем эту функцию в двух вариантах.

## # A tibble: 6 x 3
##   country     year   cases
##   <chr>       <chr>  <int>
## 1 Afghanistan 1999     745
## 2 Brazil      1999   37737
## 3 China       1999  212258
## 4 Afghanistan 2000    2666
## 5 Brazil      2000   80488
## 6 China       2000  213766
## # A tibble: 6 x 3
##   country     year   cases
##   <chr>       <chr>  <int>
## 1 Afghanistan 1999     745
## 2 Brazil      1999   37737
## 3 China       1999  212258
## 4 Afghanistan 2000    2666
## 5 Brazil      2000   80488
## 6 China       2000  213766

Функция spread

В наборе данных table2 переменная type содержит название других переменных, а в переменной count содержатся их значения. Привести набор данных к нужному виду поможет функция spread.

Функция spread имеет 3 аргумента:

  • df – дата фрейм
  • key – название столбца, который содержит ключи
  • value – название столбца, который содержит значения
## # 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

Функция separate

Функция separate может разделить один столбец на несколько новых столбцов.

Она имеет 4 аргумента:

  • df – дата фрейм
  • col – название столбца, который нужно будет разделить
  • into – название новых столбцов (в виде массива)
  • sep – тип разделителя

Давайте посмотрим на набор данных table3. Мы сказали, что переменная rate содержит себе 2 переменные. Давайте разделим эту переменную на две новых.

## # A tibble: 6 x 4
##   country      year cases  population
##   <chr>       <int> <chr>  <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

Разделитель подбирается автоматически. Если все таки R не понимает какой разделитель можно его указать.

## # A tibble: 6 x 4
##   country      year cases  population
##   <chr>       <int> <chr>  <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

Изначально наша переменная имела строковый тип, но две новые переменные имеют числовой. По умолчанию функция separate оставляет тип таким же. Если вы хотите, чтобы функция автоматически подобрала и установила новый тип, используйте аргумент convert.

## # 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

Делить можно не только по какому-то знаку, но и отступив сколько-то значений. Просто в аругменте sep поставьте размер отступа.

## # 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

Функция unite

Функция unite выполняет действие обратное функции separate. Она объединяет несколько столбцов в один столбец.

Функция unite имеет 5 аргументов:

  • df – дата фрейм
  • col – название новго столбца
  • sep – тип соединения
  • ... – название столбцов, которые нужно объединить
  • remove – удалить ли изначальные столбцы

Давайте посмотрим на набор данных table5. Мы сказали, что нужно объединить переменные century и year. Давайте объединим эти переменные в одну.

## # A tibble: 6 x 3
##   country     new   rate             
##   <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

По умолчанию соединитель это _. Поменяем его.

## # A tibble: 6 x 3
##   country     new   rate             
##   <chr>       <chr> <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

Если изначальные переменные вам нужны, то можно оставить их с помощью аргумента remove.

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