【R语言】必学包之dplyr包

【R语言】必学包之dplyr包

转自:https://blog.csdn.net/wltom1985/article/details/54973811

Rdplyr可用于处理R内部或者外部的结构化数据,相较于plyr包,dplyr专注接受dataframe对象大幅提高了速度,并且提供了更稳健的数据库接口。同时,dplyr包可用于操作Sparkdataframe。本文只是基础的dplyr包学习笔记,所以并不会讨论一些高级应用,或者与data.table包的性能比较。

1.  数据集类型转换

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

  语法 : tbl_df(data)

  举例 1:

[plain]  view plain  copy
  1. #data.frame类型数据集  
  2. class(mtcars)  
  3. #转换为tbl_df类型  
  4. ds <- tbl_df(mtcars)  
  5. #转换为data.frame类型  
  6. df <- as.data.frame(ds)  
2.   筛选:  filter

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

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

  举例 1:

[plain]  view plain  copy
  1. #过滤出cyl == 8的行  
  2. filter(mtcars, cyl == 8)  
  3. filter(mtcars, cyl < 6)  
  4. #过滤出cyl < 6 并且 vs == 1的行  
  5. filter(mtcars, cyl < 6 & vs == 1)  
  6. filter(mtcars, cyl < 6, vs == 1)  
  7. #过滤出cyl < 6 或者 vs == 1的行  
  8. filter(mtcars, cyl < 6 | vs == 1)  
  9. #过滤出cyl 为4或6的行  
  10. filter(mtcars, cyl %in% c(4, 6))  

  

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

  举例 2:

[plain]  view plain  copy
  1. #选取第一行数据  
  2. slice(mtcars, 1L)  
  3. filter(mtcars, row_number() == 1L)  
  4. #选取最后一行数据  
  5. slice(mtcars, n())  
  6. filter(mtcars, row_number() == n())  
  7. #选取第5行到最后一行所有数据  
  8. slice(mtcars, 5:n())  
  9. filter(mtcars, between(row_number(), 5, n()))  
3. 排列: arrange

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

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

  举例1:

[plain]  view plain  copy
  1. #以cyl和disp联合升序排序  
  2. arrange(mtcars, cyl, disp)  
  3. #以disp降序排序  
  4. arrange(mtcars, desc(disp))  
4. 选择: select

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

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

  举例 1:

[plain]  view plain  copy
  1. iris <- tbl_df(iris)  
  2. #选取变量名前缀包含Petal的列  
  3. select(iris, starts_with("Petal"))  
  4. #选取变量名前缀不包含Petal的列  
  5. select(iris, -starts_with("Petal"))  
  6. #选取变量名后缀包含Width的列  
  7. select(iris, ends_with("Width"))  
  8. #选取变量名后缀不包含Width的列  
  9. select(iris, -ends_with("Width"))  
  10. #选取变量名中包含etal的列  
  11. select(iris, contains("etal"))  
  12. #选取变量名中不包含etal的列  
  13. select(iris, -contains("etal"))  
  14. #正则表达式匹配,返回变量名中包含t的列  
  15. select(iris, matches(".t."))  
  16. #正则表达式匹配,返回变量名中不包含t的列  
  17. select(iris, -matches(".t."))  
  18. #直接选取列  
  19. select(iris, Petal.Length, Petal.Width)  
  20. #返回除Petal.Length和Petal.Width之外的所有列  
  21. select(iris, -Petal.Length, -Petal.Width)  
  22. #使用冒号连接列名,选择多个列  
  23. select(iris, Sepal.Length:Petal.Width)  
  24. #选择字符向量中的列,select中不能直接使用字符向量筛选,需要使用one_of函数  
  25. vars <- c("Petal.Length", "Petal.Width")  
  26. select(iris, one_of(vars))  
  27. #返回指定字符向量之外的列  
  28. select(iris, -one_of(vars))  
  29. #返回所有列,一般调整数据集中变量顺序时使用  
  30. select(iris, everything())  
  31. #调整列顺序,把Species列放到最前面  
  32. select(iris, Species, everything())  
  举例 2:

[plain]  view plain  copy
  1. df <- as.data.frame(matrix(runif(100), nrow = 10))  
  2. df <- tbl_df(df[c(3, 4, 7, 1, 9, 8, 5, 2, 6, 10)])  
  3. #选择V4,V5,V6三列  
  4. select(df, V4:V6)  
  5. select(df, num_range("V", 4:6))  
  语法 : rename(.data, ...)

  举例 3:

[plain]  view plain  copy
  1. #重命名列Petal.Length,返回子数据集只包含重命名的列  
  2. select(iris, petal_length = Petal.Length)  
  3. #重命名所有以Petal为前缀的列,返回子数据集只包含重命名的列  
  4. select(iris, petal = starts_with("Petal"))  
  5. #重命名列Petal.Length,返回全部列  
  6. rename(iris, petal_length = Petal.Length)  
5.变形: mutate

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

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

        transmute(.data, ...)

  举例 1:

[plain]  view plain  copy
  1. #添加新列wt_kg和wt_t,在同一语句中可以使用刚添加的列  
  2. mutate(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
  3. #计算新列wt_kg和wt_t,返回对象中只包含新列  
  4. transmute(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
6. 去重: distinct

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

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

  举例 1:

[plain]  view plain  copy
  1. df <- data.frame(  
  2.   x = sample(10, 100, rep = TRUE),  
  3.   y = sample(10, 100, rep = TRUE)  
  4. )  
  5. #以全部两个变量去重,返回去重后的行数  
  6. nrow(distinct(df))  
  7. nrow(distinct(df, x, y))  
  8. #以变量x去重,只返回去重后的x值  
  9. distinct(df, x)  
  10. #以变量y去重,只返回去重后的y值  
  11. distinct(df, y)  
  12. #以变量x去重,返回所有变量  
  13. distinct(df, x, .keep_all = TRUE)  
  14. #以变量y去重,返回所有变量  
  15. distinct(df, y, .keep_all = TRUE)  
  16. #对变量运算后的结果去重  
  17. distinct(df, diff = abs(x - y))  
7. 概括: summarise

  对数据框调用函数进行汇总操作, 返回一维的结果。返回多维结果时会报如下错误:
  Error: expecting result of length one, got : 2
原数据集行名称会被过滤掉。

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

   举例 1:

[plain]  view plain  copy
  1. #返回数据框中变量disp的均值  
  2. summarise(mtcars, mean(disp))  
  3. #返回数据框中变量disp的标准差  
  4. summarise(mtcars, sd(disp))  
  5. #返回数据框中变量disp的最大值及最小值  
  6. summarise(mtcars, max(disp), min(disp))  
  7. #返回数据框mtcars的行数  
  8. summarise(mtcars, n())  
  9. #返回unique的gear数  
  10. summarise(mtcars, n_distinct(gear))  
  11. #返回disp的第一个值  
  12. summarise(mtcars, first(disp))  
  13. #返回disp的最后个值  
  14. summarise(mtcars, last(disp))  
8. 抽样: sample

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

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

  举例 1:

[plain]  view plain  copy
  1. #随机无重复的取10行数据  
  2. sample_n(mtcars, 10)  
  3. #随机有重复的取50行数据  
  4. sample_n(mtcars, 50, replace = TRUE)  
  5. #随机无重复的以mpg值做权重取10行数据  
  6. sample_n(mtcars, 10, weight = mpg)  
  语法 : sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())
  举例 2:

[plain]  view plain  copy
  1. #默认size=1,相当于对全部数据无重复重新抽样  
  2. sample_frac(mtcars)  
  3. #随机无重复的取10%的数据  
  4. sample_frac(mtcars, 0.1)  
  5. #随机有重复的取总行数1.5倍的数据  
  6. sample_frac(mtcars, 1.5, replace = TRUE)  
  7. #随机无重复的以1/mpg值做权重取10%的数据  
  8. sample_frac(mtcars, 0.1, weight = 1 / mpg)  

9. 分组: group

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

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

  举例 1:

[plain]  view plain  copy
  1. #使用变量cyl对mtcars分组,返回分组后数据集  
  2. by_cyl <- group_by(mtcars, cyl)  
  3. #返回每个分组中最大disp所在的行  
  4. filter(by_cyl, disp == max(disp))  
  5. #返回每个分组中变量名包含d的列,始终返回分组列cyl  
  6. select(by_cyl, contains("d"))  
  7. #使用mpg对每个分组排序  
  8. arrange(by_cyl,  mpg)  
  9. #对每个分组无重复的取2行记录  
  10. sample_n(by_cyl, 2)  
   举例 2:
[plain]  view plain  copy
  1. #使用变量cyl对mtcars分组,然后对分组后数据集使用聚合函数  
  2. by_cyl <- group_by(mtcars, cyl)  
  3. #返回每个分组的记录数  
  4. summarise(by_cyl, n())  
  5. #求每个分组中disp和hp的均值  
  6. summarise(by_cyl, mean(disp), mean(hp))  
  7. #返回每个分组中唯一的gear的值  
  8. summarise(by_cyl, n_distinct(gear))  
  9. #返回每个分组第一个和最后一个disp值  
  10. summarise(by_cyl, first(disp))  
  11. summarise(by_cyl, last(disp))  
  12. #返回每个分组中最小的disp值  
  13. summarise(by_cyl, min(disp))  
  14. summarise(arrange(by_cyl,  disp), min(disp))  
  15. #返回每个分组中最大的disp值  
  16. summarise(by_cyl, max(disp))  
  17. summarise(arrange(by_cyl,  disp), max(disp))  
  18. #返回每个分组中disp第二个值  
  19. summarise(by_cyl, nth(disp,2))  
   举例 3:
[plain]  view plain  copy
  1. #使用cyl对数据框分组  
  2. grouped <- group_by(mtcars, cyl)  
  3. #获取分组数据集所使用的分组变量  
  4. groups(grouped)  
  5. #ungroup从数据框中移除组合信息,因此返回的分组变量为NULL  
  6. groups(ungroup(grouped))  
  语法 :group_indices(.data, ...)
返回分组后,每条记录的分组id。

  举例 4:

[plain]  view plain  copy
  1. #返回每条记录所在分组id组成的向量  
  2. group_indices(mtcars, cyl)  
   语法 : group_size(x)

        n_groups(x)

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

  举例 5:

[plain]  view plain  copy
  1. by_cyl <- group_by(mtcars, cyl)  
  2. #返回每个分组记录数组成的向量  
  3. group_size(by_cyl)  
  4. summarise(by_cyl, n())  
  5. table(mtcars$cyl)  
  6. #返回所分的组数  
  7. n_groups(by_cyl)  
  8. length(group_size(by_cyl))  

  对数据集的每个分组计数,类似于base:: table()函数。其中count已经过group_by分组,而tally需要对数据集调用group_by后对分组数据计数。
  语法 :
tally(x, wt, sort = FALSE)
        
count(x, ..., wt =NULL, sort = FALSE)

  举例 6:

[plain]  view plain  copy
  1. #使用count对分组计数,数据已按变量分组  
  2. count(mtcars, cyl)  
  3. #设置sort=TRUE,对分组计数按降序排序  
  4. count(mtcars, cyl, sort = TRUE)  
  5. #使用tally对分组计数,需要使用group_by分组  
  6. tally(group_by(mtcars, cyl))  
  7. #使用summarise对分组计数  
  8. summarise(group_by(mtcars, cyl), n())  
   举例 7:
[plain]  view plain  copy
  1. #按cyl分组,并对分组数据计算变量的gear的和  
  2. count(mtcars, cyl, wt = gear)  
  3. tally(group_by(mtcars, cyl), wt = gear)  
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中设置的后缀加以区分。

  举例 1:

[plain]  view plain  copy
  1. df1 = data.frame(CustomerId=c(1:6), sex = c("f", "m", "f", "f", "m", "m"), Product=c(rep("Toaster",3), rep("Radio",3)))  
  2. df2 = data.frame(CustomerId=c(2,4,6,7),sex = c( "m", "f", "m", "f"), State=c(rep("Alabama",3), rep("Ohio",1)))  
  3. #内连接,默认使用"CustomerId"和"sex"连接  
  4. inner_join(df1, df2)  
  5. #左连接,默认使用"CustomerId"和"sex"连接  
  6. left_join(df1, df2)  
  7. #右连接,默认使用"CustomerId"和"sex"连接  
  8. right_join(df1, df2)  
  9. #全连接,默认使用"CustomerId"和"sex"连接  
  10. full_join(df1, df2)  
  11. #内连接,使用"CustomerId"连接,同名字段sex会自动添加后缀  
  12. inner_join(df1, df2, by = c("CustomerId" = "CustomerId"))  
  13. #以CustomerId连接,返回df1中与df2匹配的记录  
  14. semi_join(df1, df2, by = c("CustomerId" = "CustomerId"))  
  15. #以CustomerId和sex连接,返回df1中与df2不匹配的记录  
  16. anti_join(df1, df2)  
11. 集合操作: set

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

    #取两个集合的交集

    intersect(x,y, ...)

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

    union(x,y, ...)

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

    union_all(x,y, ...)

    #取两个集合的差集

    setdiff(x,y, ...)

    #判断两个集合是否相等

     setequal(x, y, ...)

  举例 1:

[plain]  view plain  copy
  1. mtcars$model <- rownames(mtcars)  
  2. first <- mtcars[1:20, ]  
  3. second <- mtcars[10:32, ]  
  4. #取两个集合的交集  
  5. intersect(first, second)  
  6. #取两个集合的并集,并去重  
  7. union(first, second)  
  8. #取两个集合的差集,返回first中存在但second中不存在的记录  
  9. setdiff(first, second)  
  10. #取两个集合的交集,返回second中存在但first中不存在的记录  
  11. setdiff(second, first)  
  12. #取两个集合的交集, 不去重  
  13. union_all(first, second)  
  14. #判断两个集合是否相等,返回TRUE  
  15. setequal(mtcars, mtcars[32:1, ])  

12. 数据合并: bind

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

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

    bind_rows(...,.id = NULL)

    #按列合并

    bind_cols(...)

    #合并数据集

     combine(...)

  举例 1:

[plain]  view plain  copy
  1. one <- mtcars[1:4, ]  
  2. two <- mtcars[11:14, ]  
  3. #按行合并数据框one和two  
  4. bind_rows(one, two)  
  5. #按行合并元素为数据框的列表  
  6. bind_rows(list(one, two))  
  7. #按行合并数据框,生成id列指明数据来自的源数据框,id列的值使用数字代替  
  8. bind_rows(list(one, two), .id = "id")  
  9. #按行合并数据框,生成id列指明数据来自的源数据框,id列的值为数据框名  
  10. bind_rows(list(a = one, b = two), .id = "id")  
  11. #按列合并数据框one和two  
  12. bind_cols(one, two)  
  13. bind_cols(list(one, two))  
   举例 2:
[plain]  view plain  copy
  1. #合并数据框,列名不匹配,因此使用NA替代,使用rbind直接报错  
  2. bind_rows(data.frame(x = 1:3), data.frame(y = 1:4))  
   举例 3:
[plain]  view plain  copy
  1. #合并因子  
  2. f1 <- factor("a")  
  3. f2 <- factor("b")  
  4. c(f1, f2)  
  5. unlist(list(f1, f2))  
  6. #因子level不同,强制转换为字符型  
  7. combine(f1, f2)  
  8. combine(list(f1, f2))  
13. 条件语句:ifelse

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

  语法 :if_else(condition,true, false, missing = NULL)

missing值用于替代缺失值。

  举例 1:

[plain]  view plain  copy
  1. x <- c(-5:5, NA)  
  2. #替换所有小于0的元素为NA,为了保持类型一致,因此使用NA_integer_  
  3. if_else(x < 0, NA_integer_, x)  
  4. #使用字符串missing替换原数据中的NA元素  
  5. if_else(x < 0, "negative", "positive", "missing")  
  6. #if_else不支持类型不一致,但是ifelse可以  
  7. ifelse(x < 0, "negative", 1)  
   举例 2:
[plain]  view plain  copy
  1. x <- factor(sample(letters[1:5], 10, replace = TRUE))  
  2. #if_else会保留原有数据类型  
  3. if_else(x %in% c("a", "b", "c"), x, factor(NA))  
  4. ifelse(x %in% c("a", "b", "c"), x, factor(NA))  

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

  语法 :case_when(...)

  举例 3:

[plain]  view plain  copy
  1. #顺序执行各语句对原向量进行替换,因此越普遍的条件需放在最后  
  2. x <- 1:50  
  3. case_when(  
  4.   x %% 35 == 0 ~ "fizz buzz",  
  5.   x %% 5 == 0 ~ "fizz",  
  6.   x %% 7 == 0 ~ "buzz",  
  7.   TRUE ~ as.character(x)  
  8. )  
14. 数据库操作: database

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

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

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

  举例 1:

[plain]  view plain  copy
  1. #在默认工作路劲下创建sqlite数据库  
  2. my_db <- src_sqlite("dplyrdb.db", create = TRUE)  
[plain]  view plain  copy
  1. <span style="font-size:13.3333px;"><span style="font-family:'Courier New';background-color:rgb(255,255,255);">  </span><span style="background-color:rgb(204,204,204);">列出数据源x中所有的表</span></span><span style="background-color:rgb(204,204,204);font-family:'Courier New';font-size:13.3333px;">:<span style="font-size:13.3333px;">src_tbls(x)</span></span>  

  举例 2:

[plain]  view plain  copy
  1. #目前数据库中还没有表  
  2. src_tbls(my_db)  

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

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

  举例 3:

[plain]  view plain  copy
  1. library(nycflights13)  
  2. #导入flights数据到数据库中,并创建相应的索引  
  3. flights_sqlite <- copy_to(my_db, flights, temporary = FALSE, indexes = list(c("year", "month", "day"), "carrier", "tailnum"))  
  4. #已存在表flights  
  5. src_tbls(my_db)  

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

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

  举例 4:

[plain]  view plain  copy
  1. #查询数据库中表数据,直接给出表名  
  2. tb.flight <- tbl(my_db, 'flights')  
  3. #查询数据库中表数据,使用SQL语句返回数据  
  4. tb.flight2 <- tbl(my_db, sql("SELECT * FROM flights"))  
   举例 5:
[plain]  view plain  copy
  1. #操作数据库中数据,语句并没有被实际执行,只有显式获取数据时才会执行  
  2. c1 <- filter(tb.flight, year == 2013, month == 1, day == 1)  
  3. c2 <- select(c1, year, month, day, carrier, dep_delay, air_time, distance)  
  4. c3 <- mutate(c2, speed = distance / air_time * 60)  
  5. c4 <- arrange(c3, year, month, day, carrier)  

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

  语法: show_query(x)

        explain(x, ...)

  举例 6:

[plain]  view plain  copy
  1. #返回对象c4对应的SQL语句  
  2. show_query(c4)  
  3. #返回对象c4对应的SQL语句以及执行计划  
  4. explain(c4)  

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

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

    collect(x, ...)

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

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

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

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

     collapse(x, ...) 

  举例 7:

[plain]  view plain  copy
  1. #执行c4查询,返回对象到R  
  2. tbl_dfight <- collect(c4)  
  3. #执行查询并在数据库中创建临时表,通过src_tbls可查询到新建的temp表  
  4. compute(c4, name = 'temp_flights')  
  5. src_tbls(my_db)  
  6. #实际并没有执行查询,仍可用show_query返回对应的SQL语句  
  7. remote <- collapse(c4)  
  8. show_query(remote)  

猜你喜欢

转载自blog.csdn.net/u013344884/article/details/79675269