В
этой статье я покажу, как вы можете
использовать 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 на дату и
время, а затем разбивает время на часы,
минуты и секунды.
Комментариев нет:
Отправить комментарий