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 42 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.6202 160.0 110 3.90 2.8753 108.0 93 3.85 2.3204 258.0 110 3.08 3.2155 360.0 175 3.15 3.4406 225.0 105 2.76 3.4607 360.0 245 3.21 3.5708 146.7 62 3.69 3.1909 140.8 95 3.92 3.15010 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 12 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 23 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 34 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 45 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 56 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 67 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 78 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 89 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 910 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:将原数据框中的所有列赋给一个新变量keyvalue:将原数据框中的所有值赋给一个新变量value
…:可以指定哪些列聚到同一列中na.rm:是否删除缺失值widedata <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))widedata
person grade score1 Alex 2 782 Bob 3 893 Cathy 4 88longdata <- gather(widedata, variable, value,-person)longdata
person variable value1 Alex grade 22 Bob grade 33 Cathy grade 44 Alex score 785 Bob score 896 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 wt1 AMC Javelin 0 2 8 304 3.15 3 150 15.2 17.30 0 3.4352 Cadillac Fleetwood 0 4 8 472 2.93 3 205 10.4 17.98 0 5.2503 Camaro Z28 0 4 8 350 3.73 3 245 13.3 15.41 0 3.8404 Chrysler Imperial 0 4 8 440 3.23 3 230 14.7 17.42 0 5.3455 Datsun 710 1 1 4 108 3.85 4 93 22.8 18.61 1 2.3206 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
information1 Alex-2-782 Bob-3-893 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 score1 Alex 2 782 Bob 3 893 Cathy 4 88
可见separate()函数和unite()函数的功能相反。
|