首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

必学包之dplyr包

百度搜索排位第一名的这位作者居然是我team的小伙伴~ 请收下我的膝盖~Orz

1. 数据集类型转换

tbl_df()可用于将过长过大的数据集转换为显示更友好的 tbl_df 类型。使用dplyr包处理数据前,建议先将数据集转换为tbl对象。

语法 : tbl_df(data)

2. 筛选: filter

filter() 和slice()函数可以按给定的逻辑条件筛选出符合要求的子数据集, 类似于 base::subset() 函数,但代码更加简洁, 同时也支持对同一对象的任意个条件组合(表示AND时要使用&或者直接使用逗号),返回与.data相同类型的对象。原数据集行名称会被过滤掉。

语法 : filter(.data, ...)

语法 : slice(.data, ...)

slice() 函数通过行号选取数据。

3. 排列: arrange

arrange()按给定的列名依次对行进行排序,类似于base::order()函数。默认是按照升序排序,对列名加 desc() 可实现倒序排序。原数据集行名称会被过滤掉。

语法 : arrange(.data, ...)

4. 选择: select

select()用列名作参数来选择子数据集。dplyr包中提供了些特殊功能的函数与select函数结合使用, 用于筛选变量,包括starts_with,ends_with,contains,matches,one_of,num_range和everything等。用于重命名时,select()只保留参数中给定的列,rename()保留所有的列,只对给定的列重新命名。原数据集行名称会被过滤掉。

语法 : select(.data, ...)

语法 :rename(.data, ...)

5.变形: mutate

mutate()和transmute()函数对已有列进行数据运算并添加为新列,类似于base::transform() 函数, 不同的是可以在同一语句中对刚增添加的列进行操作。mutate()返回的结果集会保留原有变量,transmute()只返回扩展的新变量。原数据集行名称会被过滤掉。

语法 :mutate(.data, ...)

语法 :transmute(.data, ...)

6. 去重: distinct

distinct()用于对输入的tbl进行去重,返回无重复的行,类似于 base::unique() 函数,但是处理速度更快。原数据集行名称会被过滤掉。

语法 :distinct(.data, ..., .keep_all = FALSE)

7. 概括: summarise

对数据框调用函数进行汇总操作, 返回一维的结果。返回多维结果时会报如下错误:

Error: expecting result of length one, got : 2

原数据集行名称会被过滤掉。

语法 :summarise(.data, ...)

8. 抽样: sample

抽样函数,sample_n()随机抽取指定数目的样本,sample_frac()随机抽取指定百分比的样本,默认都为不放回抽样,通过设置replacement = TRUE可改为放回抽样,可以用于实现Bootstrap抽样。

语法 :sample_n(tbl, size, replace = FALSE, weight = NULL, .env = parent.frame())

语法 :sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())

9. 分组: group

group_by()用于对数据集按照给定变量分组,返回分组后的数据集。对返回后的数据集使用以上介绍的函数时,会自动的对分组数据操作。

语法 :group_by(.data, ..., add = FALSE)

语法 :group_indices(.data, ...)

语法 :group_size(x);n_groups(x)

group_size用于返回每个分组的记录数,n_groups返回分成的组数

对数据集的每个分组计数,类似于base:: table()函数。其中count已经过group_by分组,而tally需要对数据集调用group_by后对分组数据计数。

语法 :tally(x, wt, sort = FALSE);count(x, ..., wt =NULL, sort = FALSE)

10. 数据关联:join

数据框中经常需要将多个表进行连接操作, 如左连接、右连接、内连接等,dplyr包也提供了数据集的连接操作,类似于 base::merge() 函数。

语法如下:

#内连接,合并数据仅保留匹配的记录

inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#左连接,向数据集x中加入匹配的数据集y记录

left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#右连接,向数据集y中加入匹配的数据集x记录

right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#全连接,合并数据保留所有记录,所有行

full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

#返回能够与y表匹配的x表所有记录

semi_join(x,y, by = NULL, copy = FALSE, ...)

#返回无法与y表匹配的x表的所有记录

anti_join(x, y, by = NULL, copy = FALSE, ...)

by设置两个数据集用于匹配的字段名,默认使用全部同名字段进行匹配,如果两个数据集需要匹配的字段名不同,可以直接用等号指定匹配的字段名,如, by = c("a" = "b"),表示用x.a和y.b进行匹配。如果两个数据集来自不同的数据源,copy设置为TRUE时,会把数据集y的数据复制到数据集x中,出于性能上的考虑,需要谨慎设置copy参数为TRUE。合并后的数据集中同名变量,会自动添加suffix中设置的后缀加以区分。

11. 集合操作: set

dplyr也提供了集合操作函数,实际上是对base包中的集合操作的重写,但是对数据框和其它表格形式的数据操作更加高效。

语法如下:

#取两个集合的交集

intersect(x,y, ...)

#取两个集合的并集,并进行去重

union(x,y, ...)

#取两个集合的并集,不去重

union_all(x,y, ...)

#取两个集合的差集

setdiff(x,y, ...)

#判断两个集合是否相等

setequal(x, y, ...)

12. 数据合并: bind

dplyr包中也提供了按行/列合并数据集的函数,合并的对象为数据框,也可以是能够转换为数据框的列表。按行合并函数bind_rows()通过列名进行匹配,不匹配的值使用NA替代,类似于base:: rbind()函数。按列合并函数bind_cols()通过行号匹配,因此合并的数据框必须有相同的行数,函数类似于base:: cbind()函数。原数据集行名称会被过滤掉。

语法如下:

#按行合并,.id添加新列用于指明合并后每条数据来自的源数据框

bind_rows(...,.id = NULL)

#按列合并

bind_cols(...)

#合并数据集

combine(...)

13. 条件语句:ifelse

dplyr包也提供了更加严格的条件操作语句,if_else函数类似于base::ifelse(),不同的是true和false对应的值必须要有相同的类型,这样使得输出类型更容易预测,因此相对而言执行效率更高。

语法 :if_else(condition,true, false, missing = NULL)missing值用于替代缺失值。

case_when语句类似于if/else语句。表达式使用“~”连接,左值LHS为条件语句用于判断满足条件的元素,右值为具有相同类型的替换值,用于替换满足条件的元素。

语法 :case_when(...)

14. 数据库操作: database

dplyr也提供了对数据库的连接和操作函数,目前仅支持sqlite, mysql,postgresql以及google bigquery。dplyr可把R代码自动转换为SQL语句,然后在数据库上执行以获取数据。实际的处理过程中,所有的R代码并不是立即执行,而是在实际获取数据的时候,一次性在数据库中执行。下面以sqlite数据库为例。

创建和连接数据库: src_sqlite(path, create = FALSE)

当create为FALSE(默认),path必须为已存在的数据库路径和全名,为TRUE,会根据设置的path创建sqlite数据库。

导入数据到创建的数据库中并创建相应的表,如果未给出表名则使用传入的data frame名称,导入时可以通过indexes参数给创建的表添加索引, copy_to同时会执行ANALYZE命令以保证表具有最新的统计信息并且执行相应的查询优化。

导入数据到远程数据源:copy_to(dest, df, name =deparse(substitute(df)), temporary, indexes,...)

tbl可用于与源数据源(src)中的数据(from)建立连接,from可以是表名或者是SQL语句返回的数据。

与数据库建立连接: tbl(src, from, ...)

在未显式获取数据时,所有的操作只是生成tbl_sql对象,可以通过以下操作获取返回相应的SQL语句以及执行计划。

语法:show_query(x);explain(x, ...)

对于lazy操作的这种机制,数据操作实际并没有真正的执行查询,如果需要返回数据结果,可以用以下的函数强制执行查询并返回结果。

#强制执行查询,并返回tbl_df对象到R

collect(x, ...)

#强制执行查询,并在源数据库中创建临时表存储结果

compute(x, name = random_table_name(),temporary = TRUE,

unique_indexes = list(), indexes = list(),...)

#不强制执行查询,拆分复杂的tbl对象,以便添加额外的约束

collapse(x, ...)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180516G1HCTN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券