博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
reshape2包的进化版—tidyr包
阅读量:6094 次
发布时间:2019-06-20

本文共 5310 字,大约阅读时间需要 17 分钟。

hot3.png

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

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

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

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

  3. unit—多列合并为一列

  4. separate—将一列分离为多列

下面使用datasets包中的mtcars数据集做演示。

library(tidyr)library(dplyr)head(mtcars)                   mpg cyl disp  hp drat    wt  qsec vs am gear carbMazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2Valiant           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 value1         Mazda RX4       mpg  21.02     Mazda RX4 Wag       mpg  21.03        Datsun 710       mpg  22.84    Hornet 4 Drive       mpg  21.45 Hornet Sportabout       mpg  18.76           Valiant       mpg  18.1tail(mtcarsNew)               car attribute value347  Porsche 914-2      carb     2348   Lotus Europa      carb     2349 Ford Pantera L      carb     4350   Ferrari Dino      carb     6351  Maserati Bora      carb     8352     Volvo 142E      carb     2

如你所见,除了car列外,其余列聚合成两列,分别命名为attributevalue

tidyr很好的一点是可以只gather若干列而其他列保持不变。如果你想gathermapgear之间的所有列而保持carbcar列不变,可以像下面这样做:

mtcarsNew <- mtcars %>% gather(attribute, value, mpg:gear)head(mtcarsNew)                car carb attribute value1         Mazda RX4    4       mpg  21.02     Mazda RX4 Wag    4       mpg  21.03        Datsun 710    1       mpg  22.84    Hornet 4 Drive    1       mpg  21.45 Hornet Sportabout    2       mpg  18.76           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 gear1        AMC Javelin    2 15.2   8  304 150 3.15 3.435 17.30  0  0    32 Cadillac Fleetwood    4 10.4   8  472 205 2.93 5.250 17.98  0  0    33         Camaro Z28    4 13.3   8  350 245 3.73 3.840 15.41  0  0    34  Chrysler Imperial    4 14.7   8  440 230 3.23 5.345 17.42  0  0    35         Datsun 710    1 22.8   4  108  93 3.85 2.320 18.61  1  1    46   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:14hour <- 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 event1  2016-01-01    7  30     29     u2  2016-01-02    9  43     36     a3  2016-01-03   13  58     60     l4  2016-01-04   20  22     11     q5  2016-01-05    5  44     47     p6  2016-01-06   18  52     37     k7  2016-01-07   19  12     43     r8  2016-01-08   12  35      6     i9  2016-01-09   11   7     38     e10 2016-01-10    1  14     21     b11 2016-01-11    3  20     42     w12 2016-01-12   14   1     32     t13 2016-01-13   23  19     52     h14 2016-01-14   21  41     26     s15 2016-01-15    8  16     25     o

现在,我们需要把datehourminsecond列合并为新列datetime。通常,R中的日期时间格式为"Year-Month-Day-Hour:Min:Second"。

dataNew <- data %>%  unite(datehour, date, hour, sep = ' ') %>%  unite(datetime, datehour, min, second, sep = ':')dataNew              datetime event1   2016-01-01 7:30:29     u2   2016-01-02 9:43:36     a3  2016-01-03 13:58:60     l4  2016-01-04 20:22:11     q5   2016-01-05 5:44:47     p6  2016-01-06 18:52:37     k7  2016-01-07 19:12:43     r8   2016-01-08 12:35:6     i9   2016-01-09 11:7:38     e10  2016-01-10 1:14:21     b11  2016-01-11 3:20:42     w12  2016-01-12 14:1:32     t13 2016-01-13 23:19:52     h14 2016-01-14 21:41:26     s15  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 event1  2016-01-01   07  30     29     u2  2016-01-02   09  43     36     a3  2016-01-03   13  59     00     l4  2016-01-04   20  22     11     q5  2016-01-05   05  44     47     p6  2016-01-06   18  52     37     k7  2016-01-07   19  12     43     r8  2016-01-08   12  35     06     i9  2016-01-09   11  07     38     e10 2016-01-10   01  14     21     b11 2016-01-11   03  20     42     w12 2016-01-12   14  01     32     t13 2016-01-13   23  19     52     h14 2016-01-14   21  41     26     s15 2016-01-15   08  16     25     o

首先,将datetime分为date列和time列。然后,将time列分为hourminsecond列。

本文由雪晴数据网负责翻译整理,原文请参考作者Teja Kodali。转载请注明原文链接

转载于:https://my.oschina.net/u/2605101/blog/599057

你可能感兴趣的文章
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
[Usaco2015 dec]Max Flow
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
android studio修改新项目package名称
查看>>
深入python的set和dict
查看>>
C++ 11 lambda
查看>>