您的位置:首页 > 其它

reshape2包的进化版—tidyr包

2016-01-07 00:00 106 查看
摘要: 在本篇文章,我将演示如何使用tidyr包来做数据处理。tidyr包的作者是HadleyWickham。这个包常跟dplyr结合使用。本文将演示tidyr包中下述四个函数的用法:gather—宽数据转为长数据。类似于reshape2包中的...

在本篇文章,我将演示如何使用
tidyr
包来做数据处理。
tidyr
包的作者是Hadley Wickham。这个包常跟
dplyr
结合使用。

本文将演示
tidyr
包中下述四个函数的用法:

gather
—宽数据转为长数据。类似于
reshape2
包中的
melt
函数

spread
—长数据转为宽数据。类似于
reshape2
包中的
cast
函数

unit
—多列合并为一列

separate
—将一列分离为多列

下面使用
datasets
包中的
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

为方便处理,在数据集中增加一列
car


mtcars$car <- rownames(mtcars)
mtcars <- mtcars[, c(12, 1:11)]


gather

gather
的调用格式为:

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

这里,
...
表示需要聚合的指定列。

reshape2
包中的
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
列外,其余列聚合成两列,分别命名为
attribute
value


tidyr
很好的一点是可以只
gather
若干列而其他列保持不变。如果你想
gather
map
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)

reshape2
包中的
cast
函数一样,得到如下结果:

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


unite

unite
的调用格式如下:

unite(data, col, ..., sep = "_", remove = TRUE)
where ... represents the columns to unite and col represents the c

这里,
...
表示需要合并的列,
col
表示合并后的列。

我们先虚构一些数据:

set.seed(1)
date <- as.Date('2016-01-01') + 0:14
hour <- sample(1:24, 15)
min <- sample(1:60, 15)
second <- sample(1:60, 15)
event <- sample(letters, 15)
data <- data.frame(date, hour, min, second, event)
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

现在,我们需要把
date
hour
min
second
列合并为新列
datetime
。通常,R中的日期时间格式为"Year-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", ...)

我们可以用
separate
函数将数据恢复到刚创建的时候,如下所示:

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   07  30     29     u
2  2016-01-02   09  43     36     a
3  2016-01-03   13  59     00     l
4  2016-01-04   20  22     11     q
5  2016-01-05   05  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     06     i
9  2016-01-09   11  07     38     e
10 2016-01-10   01  14     21     b
11 2016-01-11   03  20     42     w
12 2016-01-12   14  01     32     t
13 2016-01-13   23  19     52     h
14 2016-01-14   21  41     26     s
15 2016-01-15   08  16     25     o

首先,将
datetime
分为
date
列和
time
列。然后,将
time
列分为
hour
min
second
列。

本文由雪晴数据网负责翻译整理,原文请参考Data manipulation with tidyr作者Teja Kodali。转载请注明原文链接http://www.xueqing.cc/cms/article/105
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: