Данные зачастую бывают не в том виде, в котором нам нужно. Мы уже преобразовывали данные с помощью пакета 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
В наборе данных 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
В наборе данных 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 может разделить один столбец на несколько новых столбцов.
Она имеет 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 выполняет действие обратное функции 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