R语言数据处理包dplyr、tidyr笔记

来源:互联网 时间:2016-11-29

dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口;tidyr包的作者是Hadley Wickham, 该包用于“tidy”你的数据,这个包常跟dplyr结合使用。

本文将介绍dplyr包的下述五个函数用法:

  • 筛选: filter()
  • 排列: arrange()
  • 选择: select()
  • 变形: mutate()
  • 汇总: summarise()
  • 分组: group_by()

以及tidyr包的下述四个函数用法:

  • gather—宽数据转为长数据;
  • spread—长数据转为宽数据;
  • unit—多列合并为一列;
  • separate—将一列分离为多列;

dplyr、tidyr包安装及载入

install.packages("dplyr")

install.packages("tidyr")

library(dplyr)

library(tidyr)

使用datasets包中的mtcars数据集做演示,首先将过长的数据整理成友好的tbl_df数据:

mtcars_df = tbl_df(mtcars)

dplyr包基本操作

1.1 筛选: filter()

按给定的逻辑判断筛选出符合要求的子数据集

filter(mtcars_df,mpg==21,hp==110)

# A tibble: 2 x 11

mpg cyl disp hp drat wt qsec vs am gear carb

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>

1 21 6 160 110 3.9 2.620 16.46 0 1 4 4

2 21 6 160 110 3.9 2.875 17.02 0 1 4 4

1.2 排列: arrange()

按给定的列名依次对行进行排序:

arrange(mtcars_df, disp) #可对列名加 desc(disp) 进行倒序

# A tibble: 32 x 11

mpg cyl disp hp drat wt qsec vs am gear carb

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>

1 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1

2 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2

3 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1

4 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1

5 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2

6 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1

7 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1

8 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2

9 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

10 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2

# ... with 22 more rows

1.3 选择: select()

用列名作参数来选择子数据集:

select(mtcars_df, disp:wt)

# A tibble: 32 x 4

disp hp drat wt

* <dbl> <dbl> <dbl> <dbl>

1 160.0 110 3.90 2.620

2 160.0 110 3.90 2.875

3 108.0 93 3.85 2.320

4 258.0 110 3.08 3.215

5 360.0 175 3.15 3.440

6 225.0 105 2.76 3.460

7 360.0 245 3.21 3.570

8 146.7 62 3.69 3.190

9 140.8 95 3.92 3.150

10 167.6 123 3.92 3.440

# ... with 22 more rows

1.4 变形: mutate()

对已有列进行数据运算并添加为新列:

mutate(mtcars_df,

NO = 1:dim(mtcars_df)[1])

# A tibble: 32 x 12

mpg cyl disp hp drat wt qsec vs am gear carb NO

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>

1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1

2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2

3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3

4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4

5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 5

6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 6

7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 7

8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 8

9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 9

10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 10

# ... with 22 more rows

1.5 汇总: summarise()

对数据框调用其它函数进行汇总操作, 返回一维的结果:

summarise(mtcars_df,

mdisp = mean(disp, na.rm = TRUE))

# A tibble: 1 x 1

mdisp

<dbl>

1 230.7219

1.6 分组: group_by()

当对数据集通过group_by()添加了分组信息后,mutate(),arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作。

cars <- group_by(mtcars_df, cyl)

countcars <- summarise(cars, count = n()) # count = n()用来计算次数

# A tibble: 3 x 2

cyl count

<dbl> <int>

1 4 11

2 6 7

3 8 14

tidyr包基本操作

2.1 宽转长:gather()

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

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

data:需要被转换的宽形表

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

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

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

na.rm:是否删除缺失值

widedata <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))

widedata

person grade score

1 Alex 2 78

2 Bob 3 89

3 Cathy 4 88

longdata <- gather(widedata, variable, value,-person)

longdata

person variable value

1 Alex grade 2

2 Bob grade 3

3 Cathy grade 4

4 Alex score 78

5 Bob score 89

6 Cathy score 88

2.2 长转宽: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 am carb cyl disp drat gear hp mpg qsec vs wt

1 AMC Javelin 0 2 8 304 3.15 3 150 15.2 17.30 0 3.435

2 Cadillac Fleetwood 0 4 8 472 2.93 3 205 10.4 17.98 0 5.250

3 Camaro Z28 0 4 8 350 3.73 3 245 13.3 15.41 0 3.840

4 Chrysler Imperial 0 4 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 0 2 8 318 2.76 3 150 15.5 16.87 0 3.520

2.3 合并:unit()

unite的调用格式如下:

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

data:为数据框

col:被组合的新列名称

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

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

remove:是否删除被组合的列

wideunite<-unite(widedata, information, person, grade, score, sep= "-")

wideunite

information

1 Alex-2-78

2 Bob-3-89

3 Cathy-4-88

2.4 拆分:separate()

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

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

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

data:为数据框

col:需要被拆分的列

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

sep:被拆分列的分隔符

remove:是否删除被分割的列

widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")

widesep

person grade score

1 Alex 2 78

2 Bob 3 89

3 Cathy 4 88

可见separate()函数和unite()函数的功能相反。

反馈与建议

相关阅读:
Top