tidyr包--数据处理包

来源:转载

tidyr包的作者是Hadley Wickham。这个包常跟dplyr结合使用。本文将介绍tidyr包中下述四个函数的用法:

  • gather—宽数据转为长数据。类似于reshape2包中的melt函数
  • spread—长数据转为宽数据。类似于reshape2包中的cast函数
  • unit—多列合并为一列
  • separate—将一列分离为多列

1.载入包

# 使用datasets包中的mtcars数据集做演示

library(tidyr)

library(dplyr)

head(mtcars)

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

mtcars$car <- rownames(mtcars)

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

View(mtcars)

2.gather--宽数据转为长数据

使用gather()函数实现宽表转长表,语法如下:

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

data:需要被转换的宽形表

key:将原数据框中的所有列赋给一个新变量key

value:将原数据框中的所有值赋给一个新变量value

…:可以指定哪些列聚到同一列中

na.rm:是否删除缺失值

开始使用:

# 除了car列外,其余列聚合成两列,分别命名为attribute和value

mtcarsNew <- mtcars %>% gather(attribute, value, -car)

head(mtcarsNew)

如你所见,除了car列外,其余列聚合成两列,分别命名为attribute和value。tidyr很好的一点是可以只gather若干列而其他列保持不变。如果你想gather在map和gear之间的所有列而保持carb和car列不变,可以像下面这样做:

# gather在map和gear之间的所有列而保持carb和car列不变

mtcarsNew <- mtcars %>% gather(attribute, value, mpg:gear)

head(mtcarsNew)

3.spread--长数据转为宽数据

有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。使用spread()函数实现长表转宽表,语法如下:

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

data:为需要转换的长形表

key:需要将变量值拓展为字段的变量

value:需要分散的值

fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

使用:

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

4.unite--多列合并为一列

unite的调用格式如下:

unite(data, col, …, sep = “_”, remove = TRUE)

data:为数据框

col:被组合的新列名称

…:指定哪些列需要被组合

sep:组合列之间的连接符,默认为下划线

remove:是否删除被组合的列

其作用是将多列合并为一列,举例如下:

# 虚构一些数据

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)

View(data)

# 把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 = ':')

View(dataNew)

5.separate--将一列分离为多列

separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分,语法如下:

separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,

convert = FALSE, extra = “warn”, fill = “warn”, …)

data:为数据框

col:需要被拆分的列

into:新建的列名,为字符串向量

sep:被拆分列的分隔符

remove:是否删除被分割的列

举例如下:

# 可以用separate函数将数据恢复到刚创建的时候

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

data1 <- dataNew %>%

separate(datetime, c('date', 'time'), sep = ' ') %>%

separate(time, c('hour', 'min', 'second'), sep = ':')

data1

6.tidyr包0.5.0版本新特性

目前tidyr包已更新至0.5.1版本,接下来简要介绍0.5.0版本中三个有用的新特性:

准备工作:

library('tidyr')

library(tibble)

注:为了保持跟原文一致,本文用的是data.frame的精简版data_frame。需加载tibble包。

三个新特性

(1)separate_rows():通过分隔符将那些含有多个值的字段拆分为多行。

separate_rows(data, ..., sep = "[^[:alnum:].]+", convert = FALSE)

data:数据

...:需要被拆分的列

sep:分隔符

示例操作:

df <- data_frame(x = 1:2,y = c("a,b","d,e,f"));df

df %>% separate_rows(y,sep = ",")

 

df %>% separate(y,c("y1","y2","y3"),sep = ",",fill = "right")

(2)spread()函数增加了一个sep参数:用于将列名设置为“key|sep|value”格式。这在对字段为数值型数据做重塑时非常有用。

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

data:为需要转换的长形表

key:需要将变量值拓展为字段的变量

value:需要分散的值

fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

sep:用于将列名设置为“key|sep|value”格式

示例:

df <- data_frame(x = c(1,2,1),

key = c(1,1,2),

val = c("a","b","c"));df

df %>% spread(key,val)

df %>% spread(key,val,sep = "_")

(3)unnest()函数增加了一个.sep参数。当数据框的多个列包含有相同变量名的时候非常有用:

unnest()嵌套list的列

unnest(data, ..., .drop = NA, .id = NULL, .sep = NULL)

data:数据框

...:要嵌套的列

.id:用于显示列表中定义的名称

.sep:当数据框的多个列包含相同变量名的时候非常有用

使用示例:

df <- data_frame(x = 1:2,

y1 = list(data_frame(y = 1),data_frame(y = 2)),

y2 = list(data_frame(y = "a"),data_frame(y = "b")))

df

df %>% unnest()

df %>% unnest(.sep = "_")

同时,unnest()函数添加了.id参数用于显示列表中定义的名称:

df <- data_frame(x = 1:2,

y = list(a = 1:3,b = 3:1));df

df %>% unnest()

df %>% unnest(.id = "id")

 

本文链接:http://www.cnblogs.com/homewch/p/5778405.html

分享给朋友:
您可能感兴趣的文章:
随机阅读: