рекомендации

понедельник, 9 апреля 2018 г.

Обработка данных в R с помощью пакета tidyr


В этой статье я покажу, как вы можете использовать tidyr для обработки данных. tidyr - это пакет от Hadley Wickham, который упрощает упорядочивание ваших данных. Он часто используется в сочетании с dplyr. Данные считаются упорядоченными, когда каждый столбец представляет переменную, и каждая строка представляет собой наблюдение.

Я продемонстрирую использование следующих четырех функций из пакета tidyr:

gather - принимает несколько столбцов и преобразует их в пары "ключ - значение", в результате чего "широкие" таблицы данных превращаются в "длинные". Она аналогична функции melt из reshape2.
spread - принимает два столбца (пара "ключ - значение") и "разносит" их по разным столбцам, превращая "длинную" таблицу в "широкую". Она аналогична функции cast из reshape2.

unite - объединяет два или более столбца в один столбец.
separate - разбивает один столбец на два или более столбцов.

Я буду использовать набор данных mtcars из библиотеки наборов данных. Если вы не знакомы с ним, он выглядит так:

> library(tidyr)
> library(dplyr)
> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Давайте укажем названия автомобилей в столбце, называемом cars, для упрощения дальнейших действий.

> mtcars$car <- font="" mtcars="" rownames="">
> mtcars <- 1:11="" c="" font="" mtcars="">

gather

gather имеет следующий синтаксис:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

где ... это преобразуемые столбцы.

Мы можем воспроизвести то, что делает функция melt, следующим образом:

> mtcarsNew <- mtcars="">% gather(attribute, value, -car)
> head(mtcarsNew)
                car attribute value
1         Mazda RX4       mpg  21.0
2     Mazda RX4 Wag       mpg  21.0
3        Datsun 710       mpg  22.8
4    Hornet 4 Drive       mpg  21.4
5 Hornet Sportabout       mpg  18.7
6           Valiant       mpg  18.1

> tail(mtcarsNew)
               car attribute value
347  Porsche 914-2      carb     2
348   Lotus Europa      carb     2
349 Ford Pantera L      carb     4
350   Ferrari Dino      carb     6
351  Maserati Bora      carb     8
352     Volvo 142E      carb     2

Как вы можете видеть, она собирает все столбцы, кроме car, и помещает их имя и значение в столбцы attritube и value соответственно.

Самое замечательное в tidyr то, что вы можете собрать только определенные столбцы и оставить остальные. Если мы хотим собрать все столбцы от mpg до gear, и оставить столбцы carb и car, как они есть, мы можем сделать это следующим образом:

> mtcarsNew <- mtcars="">% gather(attribute, value, mpg:gear)
> head(mtcarsNew)
                car carb attribute value
1         Mazda RX4    4       mpg  21.0
2     Mazda RX4 Wag    4       mpg  21.0
3        Datsun 710    1       mpg  22.8
4    Hornet 4 Drive    1       mpg  21.4
5 Hornet Sportabout    2       mpg  18.7
6           Valiant    1       mpg  18.1

spread

spread имеет следующий синтаксис:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

Мы можем воспроизвести то, что делает cast, следующим образом:

> mtcarsSpread <- mtcarsnew="">% spread(attribute, value)
> head(mtcarsSpread)
                 car carb am cyl disp drat gear  hp  mpg  qsec vs    wt
1        AMC Javelin    2  0   8  304 3.15    3 150 15.2 17.30  0 3.435
2 Cadillac Fleetwood    4  0   8  472 2.93    3 205 10.4 17.98  0 5.250
3         Camaro Z28    4  0   8  350 3.73    3 245 13.3 15.41  0 3.840
4  Chrysler Imperial    4  0   8  440 3.23    3 230 14.7 17.42  0 5.345
5         Datsun 710    1  1   4  108 3.85    4  93 22.8 18.61  1 2.320
6   Dodge Challenger    2  0   8  318 2.76    3 150 15.5 16.87  0 3.520

unite

unite имеет следующий синтаксис:

unite(data, col, ..., sep = "_", remove = TRUE)

где ... представляет столбцы для объединения, а col представляет столбец для добавления.

Давайте создадим фиктивный набор данных:

> set.seed(1)
> date <- 0:14="" as.date="" font="">
> hour <- 15="" font="" sample="">
> min <- 15="" font="" sample="">
> second <- 15="" font="" sample="">
> event <- 15="" font="" letters="" sample="">
> data <- data.frame="" date="" event="" font="" hour="" min="" second="">
> data
         date hour min second event
1  2016-01-01    7  30     29     u
2  2016-01-02    9  43     36     a
3  2016-01-03   13  58     60     l
4  2016-01-04   20  22     11     q
5  2016-01-05    5  44     47     p
6  2016-01-06   18  52     37     k
7  2016-01-07   19  12     43     r
8  2016-01-08   12  35      6     i
9  2016-01-09   11   7     38     e
10 2016-01-10    1  14     21     b
11 2016-01-11    3  20     42     w
12 2016-01-12   14   1     32     t
13 2016-01-13   23  19     52     h
14 2016-01-14   21  41     26     s
15 2016-01-15    8  16     25     o

Теперь давайте объединим дату, часы, минуты и секунды в новый столбец с именем datetime. Обычно в R дата и время используются в формате ear-Month-Day Hour:Min:Second.

> dataNew <- data="">%
   unite(datehour, date, hour, sep = ' ') %>%
   unite(datetime, datehour, min, second, sep = ':')
> dataNew
              datetime event
1   2016-01-01 7:30:29     u
2   2016-01-02 9:43:36     a
3  2016-01-03 13:58:60     l
4  2016-01-04 20:22:11     q
5   2016-01-05 5:44:47     p
6  2016-01-06 18:52:37     k
7  2016-01-07 19:12:43     r
8   2016-01-08 12:35:6     i
9   2016-01-09 11:7:38     e
10  2016-01-10 1:14:21     b
11  2016-01-11 3:20:42     w
12  2016-01-12 14:1:32     t
13 2016-01-13 23:19:52     h
14 2016-01-14 21:41:26     s
15  2016-01-15 8:16:25     o


separate

separate имеет следующий синтаксис:

separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,
convert = FALSE, extra = "warn", fill = "warn", ...)

Мы можем вернуть данные в исходный формат следующим образом:

> data1 <- datanew="">% 
   separate(datetime, c('date', 'time'), sep = ' ') %>% 
   separate(time, c('hour', 'min', 'second'), sep = ':')
> data1
         date hour min second event
1  2016-01-01    7  30     29     u
2  2016-01-02    9  43     36     a
3  2016-01-03   13  58     60     l
4  2016-01-04   20  22     11     q
5  2016-01-05    5  44     47     p
6  2016-01-06   18  52     37     k
7  2016-01-07   19  12     43     r
8  2016-01-08   12  35      6     i
9  2016-01-09   11   7     38     e
10 2016-01-10    1  14     21     b
11 2016-01-11    3  20     42     w
12 2016-01-12   14   1     32     t
13 2016-01-13   23  19     52     h
14 2016-01-14   21  41     26     s
15 2016-01-15    8  16     25     o

Сначала она разбивает столбец datetime на дату и время, а затем разбивает время на часы, минуты и секунды.


Комментариев нет:

Отправить комментарий