久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【R語言】必學包之dplyr包

 宋娃娃姓宋 2017-12-04

     Rdplyr可用于處理R內(nèi)部或者外部的結(jié)構(gòu)化數(shù)據(jù),,相較于plyr包,,dplyr專注接受dataframe對象大幅提高了速度,并且提供了更穩(wěn)健的數(shù)據(jù)庫接口,。同時,dplyr包可用于操作Sparkdataframe,。本文只是基礎的dplyr包學習筆記,,所以并不會討論一些高級應用,或者與data.table包的性能比較,。

1.  數(shù)據(jù)集類型轉(zhuǎn)換

    tbl_df()可用于將過長過大的數(shù)據(jù)集轉(zhuǎn)換為顯示更友好的 tbl_df 類型,。使用dplyr包處理數(shù)據(jù)前,建議先將數(shù)據(jù)集轉(zhuǎn)換為tbl對象,。

  語法 : tbl_df(data)

  舉例 1:

  1. #data.frame類型數(shù)據(jù)集  
  2. class(mtcars)  
  3. #轉(zhuǎn)換為tbl_df類型  
  4. ds <- tbl_df(mtcars)  
  5. #轉(zhuǎn)換為data.frame類型  
  6. df <- as.data.frame(ds)  
2.   篩選:  filter

    filter() 和slice()函數(shù)可以按給定的邏輯條件篩選出符合要求的子數(shù)據(jù)集, 類似于 base::subset() 函數(shù),,但代碼更加簡潔, 同時也支持對同一對象的任意個條件組合(表示AND時要使用&或者直接使用逗號),返回與.data相同類型的對象,。原數(shù)據(jù)集行名稱會被過濾掉,。

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

  舉例 1:

  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(.data, ...)

  slice() 函數(shù)通過行號選取數(shù)據(jù)。

  舉例 2:

  1. #選取第一行數(shù)據(jù)  
  2. slice(mtcars, 1L)  
  3. filter(mtcars, row_number() == 1L)  
  4. #選取最后一行數(shù)據(jù)  
  5. slice(mtcars, n())  
  6. filter(mtcars, row_number() == n())  
  7. #選取第5行到最后一行所有數(shù)據(jù)  
  8. slice(mtcars, 5:n())  
  9. filter(mtcars, between(row_number(), 5, n()))  
3. 排列: arrange

  arrange()按給定的列名依次對行進行排序,,類似于base::order()函數(shù),。默認是按照升序排序,對列名加 desc() 可實現(xiàn)倒序排序,。原數(shù)據(jù)集行名稱會被過濾掉,。

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

  舉例1:

  1. #以cyl和disp聯(lián)合升序排序  
  2. arrange(mtcars, cyl, disp)  
  3. #以disp降序排序  
  4. arrange(mtcars, desc(disp))  
4. 選擇: select

  select()用列名作參數(shù)來選擇子數(shù)據(jù)集。dplyr包中提供了些特殊功能的函數(shù)與select函數(shù)結(jié)合使用,, 用于篩選變量,,包括starts_with,ends_with,,contains,,matches,one_of,,num_range和everything等,。用于重命名時,select()只保留參數(shù)中給定的列,,rename()保留所有的列,,只對給定的列重新命名,。原數(shù)據(jù)集行名稱會被過濾掉,。

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

  舉例 1:

  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函數(shù)  
  25. vars <- c("Petal.Length", "Petal.Width")  
  26. select(iris, one_of(vars))  
  27. #返回指定字符向量之外的列  
  28. select(iris, -one_of(vars))  
  29. #返回所有列,,一般調(diào)整數(shù)據(jù)集中變量順序時使用  
  30. select(iris, everything())  
  31. #調(diào)整列順序,把Species列放到最前面  
  32. select(iris, Species, everything())  
  舉例 2:

  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:

  1. #重命名列Petal.Length,,返回子數(shù)據(jù)集只包含重命名的列  
  2. select(iris, petal_length = Petal.Length)  
  3. #重命名所有以Petal為前綴的列,返回子數(shù)據(jù)集只包含重命名的列  
  4. select(iris, petal = starts_with("Petal"))  
  5. #重命名列Petal.Length,,返回全部列  
  6. rename(iris, petal_length = Petal.Length)  
5.變形: mutate

  mutate()和transmute()函數(shù)對已有列進行數(shù)據(jù)運算并添加為新列,,類似于base::transform() 函數(shù), 不同的是可以在同一語句中對剛增添加的列進行操作。mutate()返回的結(jié)果集會保留原有變量,,transmute()只返回擴展的新變量,。原數(shù)據(jù)集行名稱會被過濾掉。

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

        transmute(.data, ...)

  舉例 1:

  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() 函數(shù),,但是處理速度更快,。原數(shù)據(jù)集行名稱會被過濾掉。

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

  舉例 1:

  1. df <- data.frame(  
  2.   x = sample(10, 100, rep = TRUE),  
  3.   y = sample(10, 100, rep = TRUE)  
  4. )  
  5. #以全部兩個變量去重,,返回去重后的行數(shù)  
  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. #對變量運算后的結(jié)果去重  
  17. distinct(df, diff = abs(x - y))  
7. 概括: summarise

  對數(shù)據(jù)框調(diào)用函數(shù)進行匯總操作, 返回一維的結(jié)果。返回多維結(jié)果時會報如下錯誤:
  Error: expecting result of length one, got : 2
原數(shù)據(jù)集行名稱會被過濾掉,。

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

  舉例 1:

  1. #返回數(shù)據(jù)框中變量disp的均值  
  2. summarise(mtcars, mean(disp))  
  3. #返回數(shù)據(jù)框中變量disp的標準差  
  4. summarise(mtcars, sd(disp))  
  5. #返回數(shù)據(jù)框中變量disp的最大值及最小值  
  6. summarise(mtcars, max(disp), min(disp))  
  7. #返回數(shù)據(jù)框mtcars的行數(shù)  
  8. summarise(mtcars, n())  
  9. #返回unique的gear數(shù)  
  10. summarise(mtcars, n_distinct(gear))  
  11. #返回disp的第一個值  
  12. summarise(mtcars, first(disp))  
  13. #返回disp的最后個值  
  14. summarise(mtcars, last(disp))  
8. 抽樣: sample

  抽樣函數(shù),,sample_n()隨機抽取指定數(shù)目的樣本,sample_frac()隨機抽取指定百分比的樣本,,默認都為不放回抽樣,,通過設置replacement = TRUE可改為放回抽樣,可以用于實現(xiàn)Bootstrap抽樣,。

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

  舉例 1:

  1. #隨機無重復的取10行數(shù)據(jù)  
  2. sample_n(mtcars, 10)  
  3. #隨機有重復的取50行數(shù)據(jù)  
  4. sample_n(mtcars, 50, replace = TRUE)  
  5. #隨機無重復的以mpg值做權(quán)重取10行數(shù)據(jù)  
  6. sample_n(mtcars, 10, weight = mpg)  
  語法 :sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())
  舉例 2:

  1. #默認size=1,,相當于對全部數(shù)據(jù)無重復重新抽樣  
  2. sample_frac(mtcars)  
  3. #隨機無重復的取10%的數(shù)據(jù)  
  4. sample_frac(mtcars, 0.1)  
  5. #隨機有重復的取總行數(shù)1.5倍的數(shù)據(jù)  
  6. sample_frac(mtcars, 1.5, replace = TRUE)  
  7. #隨機無重復的以1/mpg值做權(quán)重取10%的數(shù)據(jù)  
  8. sample_frac(mtcars, 0.1, weight = 1 / mpg)  

9. 分組: group

  group_by()用于對數(shù)據(jù)集按照給定變量分組,返回分組后的數(shù)據(jù)集,。對返回后的數(shù)據(jù)集使用以上介紹的函數(shù)時,,會自動的對分組數(shù)據(jù)操作。

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

  舉例 1:

  1. #使用變量cyl對mtcars分組,,返回分組后數(shù)據(jù)集  
  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:
  1. #使用變量cyl對mtcars分組,然后對分組后數(shù)據(jù)集使用聚合函數(shù)  
  2. by_cyl <- group_by(mtcars, cyl)  
  3. #返回每個分組的記錄數(shù)  
  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:
  1. #使用cyl對數(shù)據(jù)框分組  
  2. grouped <- group_by(mtcars, cyl)  
  3. #獲取分組數(shù)據(jù)集所使用的分組變量  
  4. groups(grouped)  
  5. #ungroup從數(shù)據(jù)框中移除組合信息,,因此返回的分組變量為NULL  
  6. groups(ungroup(grouped))  
  語法 :group_indices(.data, ...)
返回分組后,,每條記錄的分組id,。

  舉例 4:

  1. #返回每條記錄所在分組id組成的向量  
  2. group_indices(mtcars, cyl)  
  語法 :group_size(x)

        n_groups(x)

group_size用于返回每個分組的記錄數(shù),n_groups返回分成的組數(shù),。

  舉例 5:

  1. by_cyl <- group_by(mtcars, cyl)  
  2. #返回每個分組記錄數(shù)組成的向量  
  3. group_size(by_cyl)  
  4. summarise(by_cyl, n())  
  5. table(mtcars$cyl)  
  6. #返回所分的組數(shù)  
  7. n_groups(by_cyl)  
  8. length(group_size(by_cyl))  

  對數(shù)據(jù)集的每個分組計數(shù),,類似于base:: table()函數(shù)。其中count已經(jīng)過group_by分組,,而tally需要對數(shù)據(jù)集調(diào)用group_by后對分組數(shù)據(jù)計數(shù),。
  語法 :
tally(x, wt, sort = FALSE)
       
count(x, ..., wt =NULL, sort = FALSE)

  舉例 6:

  1. #使用count對分組計數(shù),數(shù)據(jù)已按變量分組  
  2. count(mtcars, cyl)  
  3. #設置sort=TRUE,,對分組計數(shù)按降序排序  
  4. count(mtcars, cyl, sort = TRUE)  
  5. #使用tally對分組計數(shù),,需要使用group_by分組  
  6. tally(group_by(mtcars, cyl))  
  7. #使用summarise對分組計數(shù)  
  8. summarise(group_by(mtcars, cyl), n())  
  舉例 7:
  1. #按cyl分組,并對分組數(shù)據(jù)計算變量的gear的和  
  2. count(mtcars, cyl, wt = gear)  
  3. tally(group_by(mtcars, cyl), wt = gear)  
10. 數(shù)據(jù)關(guān)聯(lián):join

  數(shù)據(jù)框中經(jīng)常需要將多個表進行連接操作, 如左連接,、右連接,、內(nèi)連接等,dplyr包也提供了數(shù)據(jù)集的連接操作,,類似于 base::merge() 函數(shù),。語法如下: 

  #內(nèi)連接,合并數(shù)據(jù)僅保留匹配的記錄

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

  #左連接,,向數(shù)據(jù)集x中加入匹配的數(shù)據(jù)集y記錄

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

  #右連接,,向數(shù)據(jù)集y中加入匹配的數(shù)據(jù)集x記錄

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

  #全連接,合并數(shù)據(jù)保留所有記錄,,所有行

  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設置兩個數(shù)據(jù)集用于匹配的字段名,,默認使用全部同名字段進行匹配,如果兩個數(shù)據(jù)集需要匹配的字段名不同,,可以直接用等號指定匹配的字段名,,如, by = c("a" = "b"),,表示用x.a和y.b進行匹配,。如果兩個數(shù)據(jù)集來自不同的數(shù)據(jù)源,copy設置為TRUE時,,會把數(shù)據(jù)集y的數(shù)據(jù)復制到數(shù)據(jù)集x中,,出于性能上的考慮,需要謹慎設置copy參數(shù)為TRUE,。合并后的數(shù)據(jù)集中同名變量,,會自動添加suffix中設置的后綴加以區(qū)分。

  舉例 1:

  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. #內(nèi)連接,,默認使用"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. #內(nèi)連接,,使用"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也提供了集合操作函數(shù),實際上是對base包中的集合操作的重寫,,但是對數(shù)據(jù)框和其它表格形式的數(shù)據(jù)操作更加高效,。語法如下:

    #取兩個集合的交集

    intersect(x,y, ...)

    #取兩個集合的并集,并進行去重

    union(x,y, ...)

    #取兩個集合的并集,,不去重

    union_all(x,y, ...)

    #取兩個集合的差集

    setdiff(x,y, ...)

    #判斷兩個集合是否相等

    setequal(x, y, ...)

  舉例 1:

  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. 數(shù)據(jù)合并: bind

    dplyr包中也提供了按行/列合并數(shù)據(jù)集的函數(shù),合并的對象為數(shù)據(jù)框,,也可以是能夠轉(zhuǎn)換為數(shù)據(jù)框的列表,。按行合并函數(shù)bind_rows()通過列名進行匹配,不匹配的值使用NA替代,,類似于base:: rbind()函數(shù),。按列合并函數(shù)bind_cols()通過行號匹配,因此合并的數(shù)據(jù)框必須有相同的行數(shù),,函數(shù)類似于base:: cbind()函數(shù),。原數(shù)據(jù)集行名稱會被過濾掉。語法如下:

    #按行合并,,.id添加新列用于指明合并后每條數(shù)據(jù)來自的源數(shù)據(jù)框

    bind_rows(...,.id = NULL)

    #按列合并

    bind_cols(...)

    #合并數(shù)據(jù)集

    combine(...)

  舉例 1:

  1. one <- mtcars[1:4, ]  
  2. two <- mtcars[11:14, ]  
  3. #按行合并數(shù)據(jù)框one和two  
  4. bind_rows(one, two)  
  5. #按行合并元素為數(shù)據(jù)框的列表  
  6. bind_rows(list(one, two))  
  7. #按行合并數(shù)據(jù)框,,生成id列指明數(shù)據(jù)來自的源數(shù)據(jù)框,id列的值使用數(shù)字代替  
  8. bind_rows(list(one, two), .id = "id")  
  9. #按行合并數(shù)據(jù)框,,生成id列指明數(shù)據(jù)來自的源數(shù)據(jù)框,,id列的值為數(shù)據(jù)框名  
  10. bind_rows(list(a = one, b = two), .id = "id")  
  11. #按列合并數(shù)據(jù)框one和two  
  12. bind_cols(one, two)  
  13. bind_cols(list(one, two))  
  舉例 2:
  1. #合并數(shù)據(jù)框,列名不匹配,,因此使用NA替代,,使用rbind直接報錯  
  2. bind_rows(data.frame(x = 1:3), data.frame(y = 1:4))  
  舉例 3:
  1. #合并因子  
  2. f1 <- factor("a")  
  3. f2 <- factor("b")  
  4. c(f1, f2)  
  5. unlist(list(f1, f2))  
  6. #因子level不同,強制轉(zhuǎn)換為字符型  
  7. combine(f1, f2)  
  8. combine(list(f1, f2))  
13. 條件語句:ifelse

  dplyr包也提供了更加嚴格的條件操作語句,,if_else函數(shù)類似于base::ifelse(),,不同的是true和false對應的值必須要有相同的類型,這樣使得輸出類型更容易預測,,因此相對而言執(zhí)行效率更高,。

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

missing值用于替代缺失值。

  舉例 1:

  1. x <- c(-5:5, NA)  
  2. #替換所有小于0的元素為NA,,為了保持類型一致,,因此使用NA_integer_  
  3. if_else(x < 0, NA_integer_, x)  
  4. #使用字符串missing替換原數(shù)據(jù)中的NA元素  
  5. if_else(x < 0, "negative", "positive", "missing")  
  6. #if_else不支持類型不一致,,但是ifelse可以  
  7. ifelse(x < 0, "negative", 1)  
  舉例 2:
  1. x <- factor(sample(letters[1:5], 10, replace = TRUE))  
  2. #if_else會保留原有數(shù)據(jù)類型  
  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:

  1. #順序執(zhí)行各語句對原向量進行替換,,因此越普遍的條件需放在最后  
  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. 數(shù)據(jù)庫操作: database

  dplyr也提供了對數(shù)據(jù)庫的連接和操作函數(shù),目前僅支持sqlite, mysql,,postgresql以及google bigquery,。dplyr可把R代碼自動轉(zhuǎn)換為SQL語句,然后在數(shù)據(jù)庫上執(zhí)行以獲取數(shù)據(jù),。實際的處理過程中,,所有的R代碼并不是立即執(zhí)行,而是在實際獲取數(shù)據(jù)的時候,,一次性在數(shù)據(jù)庫中執(zhí)行,。下面以sqlite數(shù)據(jù)庫為例。

  創(chuàng)建和連接數(shù)據(jù)庫: src_sqlite(path, create = FALSE)

  當create為FALSE(默認),,path必須為已存在的數(shù)據(jù)庫路徑和全名,,為TRUE,會根據(jù)設置的path創(chuàng)建sqlite數(shù)據(jù)庫,。

  舉例 1:

  1. #在默認工作路勁下創(chuàng)建sqlite數(shù)據(jù)庫  
  2. my_db <- src_sqlite("dplyrdb.db", create = TRUE)  
  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);">列出數(shù)據(jù)源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:

  1. #目前數(shù)據(jù)庫中還沒有表  
  2. src_tbls(my_db)  

  導入數(shù)據(jù)到創(chuàng)建的數(shù)據(jù)庫中并創(chuàng)建相應的表,,如果未給出表名則使用傳入的data frame名稱,導入時可以通過indexes參數(shù)給創(chuàng)建的表添加索引, copy_to同時會執(zhí)行ANALYZE命令以保證表具有最新的統(tǒng)計信息并且執(zhí)行相應的查詢優(yōu)化,。

  導入數(shù)據(jù)到遠程數(shù)據(jù)源:copy_to(dest, df, name =deparse(substitute(df)), temporary, indexes,...)

  舉例 3:

  1. library(nycflights13)  
  2. #導入flights數(shù)據(jù)到數(shù)據(jù)庫中,,并創(chuàng)建相應的索引  
  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可用于與源數(shù)據(jù)源(src)中的數(shù)據(jù)(from)建立連接,from可以是表名或者是SQL語句返回的數(shù)據(jù),。

  與數(shù)據(jù)庫建立連接: tbl(src, from, ...)

  舉例 4:

  1. #查詢數(shù)據(jù)庫中表數(shù)據(jù),,直接給出表名  
  2. tb.flight <- tbl(my_db, 'flights')  
  3. #查詢數(shù)據(jù)庫中表數(shù)據(jù),使用SQL語句返回數(shù)據(jù)  
  4. tb.flight2 <- tbl(my_db, sql("SELECT * FROM flights"))  
  舉例 5:
  1. #操作數(shù)據(jù)庫中數(shù)據(jù),,語句并沒有被實際執(zhí)行,,只有顯式獲取數(shù)據(jù)時才會執(zhí)行  
  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)  

  在未顯式獲取數(shù)據(jù)時,所有的操作只是生成tbl_sql對象,,可以通過以下操作獲取返回相應的SQL語句以及執(zhí)行計劃,。

  語法: show_query(x)

        explain(x, ...)

  舉例 6:

  1. #返回對象c4對應的SQL語句  
  2. show_query(c4)  
  3. #返回對象c4對應的SQL語句以及執(zhí)行計劃  
  4. explain(c4)  

  對于lazy操作的這種機制,數(shù)據(jù)操作實際并沒有真正的執(zhí)行查詢,,如果需要返回數(shù)據(jù)結(jié)果,,可以用以下的函數(shù)強制執(zhí)行查詢并返回結(jié)果。

    #強制執(zhí)行查詢,并返回tbl_df對象到R

    collect(x, ...)

    #強制執(zhí)行查詢,,并在源數(shù)據(jù)庫中創(chuàng)建臨時表存儲結(jié)果

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

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

    #不強制執(zhí)行查詢,,拆分復雜的tbl對象,以便添加額外的約束

    collapse(x, ...) 

  舉例 7:

  1. #執(zhí)行c4查詢,,返回對象到R  
  2. tbl_dfight <- collect(c4)  
  3. #執(zhí)行查詢并在數(shù)據(jù)庫中創(chuàng)建臨時表,通過src_tbls可查詢到新建的temp表  
  4. compute(c4, name = 'temp_flights')  
  5. src_tbls(my_db)  
  6. #實際并沒有執(zhí)行查詢,,仍可用show_query返回對應的SQL語句  
  7. remote <- collapse(c4)  
  8. show_query(remote)  


    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多