dplyr包可以看作是plyr包的一个扩展,主要是针对数据框的数据操作。
在使用dplyr包中的函数对数据框进行操作之间,最好将其转换为tbl对象:tbl_df()
一个很好的效果是,tbl对象可以根据显示空间大小来进行部分显示。
利用dplyr包常见的数据操作可归纳为以下5种:
1. 筛选 filter()
按给定的逻辑判断筛选出符合要求的子数据集, 返回符合条件的子数据集的行。类似于 base::subset() 函数
filter(.data, ...) .data为数据集,...为逻辑判断条件,多个参数条件相当于and连接
此外,... 还有一些特殊用法:
- ==,>,>= 等
- &,|,!,xor()
- is.na(),colname %in% c("factor1","factor2")
- between(),near()
2. 排列 arrange()
按给定的列名依次对行进行排序.这个函数和 plyr::arrange() 是一样的, 类似于 order()
arrange(.data, ...) ... 一串逗号分割无引号的列名。默认升序,可利用desc()进行降序
3. 选择 select()
用列名作参数来选择子数据集,类似于R自带的 subset() 函数
select(.data, ...) ...是无引号一系列的以逗号分割的表达式。可以是列名
此外,... 还有一些特殊用法:
- starts_with(x,ignor.case = TRUE) # 选择以字符x开头的变量
- ends_with(x,ignore.case = TRUE) # 选择以字符x结尾的变量
- contains(x,ignore.case = TRUE) #选择所有包含x的变量
- matches(x,ignore.case = TRUE) #选择匹配正则表达式的变量
- num_range(“x”,1:5,width = 2) #选择从x01到x05的数值型变量
- one_of(“x”,”y”,”z”) #选择包含在声明变量中的变量
- everything() #选择所有变量,一般调整数据集中变量顺序时使用
- - #排除列名
- : #mpg : disp也就相当于2:4,选择从mpg到disp的所有列
另外,select还可用于改列名。
select(iris, petal_length = Petal.Length)
相当于 rename(iris, petal_length = Petal.Length)
只是,select返回的是所选中的列,而rename返回的是所有列。
4. 扩展 mutate()
对已有列进行数据运算并添加为新列,并保留原始变量。作用与 plyr::mutate() 相同, 与base::transform() 相似, 优势在于可以在同一语句中对刚增加的列进行操作。而同样操作用R自带函数 transform() 的话就会报错
mutate(.data, ...) ... 名字-值的成对表达式,利用colname=NULL扔掉变量
此外,... 还有一些特殊用法:
- +,- 等
- log()
- lead(),lag()
- dense_rank(), min_rank(), percent_rank(), row_number(), cume_dist(), ntile()
- cumsum(), cummean(), cummin(), cummax(), cumany(), cumall()
- na_if(), coalesce()
- if_else(), recode(), case_when()
另注意:mutate添加新变量并保留原变量;而transmute扔掉原始变量。
同时与之比较相关的函数有mutate_all(),mutate_at(),mutate_if()
类似的有:transmute_all(),transmute_at(),mutate_if()
summarise_all(),summarise_at(),summarise_if()
group_by_all(),group_by_at(),group_by_if()
5. 汇总 summarise()
对数据框调用其它函数进行汇总操作, 返回一维的结果,等同于 plyr::summarise(),
summarise(.data, ...) ... 名字-值的表达式,值是汇总函数
此外, ... 还有一些特殊用法:
- Center: mean(), median()
- Spread: sd(), IQR(), mad()
- Range: min(), max(), quantile()
- Position: first(), last(), nth(),
- Count: n(), n_distinct()
- Logical: any(), all()
其实,summarise()常被用于汇总经group_by后的分组数据,并且每个组输出一行
分组操作 group_by()
根据某些变量进行分组。
group_by(.data, ..., add = FALSE) ... 用于分组的变量,add=false,覆盖现有组,true在现有组基础上添加
与之对应的还有,去除分组ungroup(x,...)