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