reshape2包的进化版—tidyr包
2016-01-07 00:00
106 查看
摘要: 在本篇文章,我将演示如何使用tidyr包来做数据处理。tidyr包的作者是HadleyWickham。这个包常跟dplyr结合使用。本文将演示tidyr包中下述四个函数的用法:gather—宽数据转为长数据。类似于reshape2包中的...
在本篇文章,我将演示如何使用
本文将演示
下面使用
为方便处理,在数据集中增加一列
这里,
与
如你所见,除了
与
这里,
我们先虚构一些数据:
现在,我们需要把
我们可以用
首先,将
本文由雪晴数据网负责翻译整理,原文请参考Data manipulation with tidyr作者Teja Kodali。转载请注明原文链接http://www.xueqing.cc/cms/article/105
在本篇文章,我将演示如何使用
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
相关文章推荐
- 程序员遇到BUG后,最好的方法是?
- 开通博客
- Tomcat 输入http://localhost:8080网页打不开(估计是端口号被占用)
- Struts2 配置文件result的name属性和type属性
- 正则表达式
- 富文本
- 文件上传的第三种方式
- java debug 信息
- 文件的操作1
- MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
- java中OutOfMemory种类和解决方法
- 通达OA进驻四川泸县住房和城乡规划建设局
- Linux 文件打开的过程
- SQL _Server实现字符串MD5加密
- Failed to set permissions of path
- android动画浅析
- hadoop框架详细分析
- Docker到底是什么?为什么它这么火!
- OpenStack的架构
- 宇宙的奥秘