Learn R | 數據預處理之dplyr包
前言
本篇文章將講解dplyr包在數據處理階段的使用,此包將原本plyr包中的ddply()等函數進一步分離強化, 專註接受"dataframe"對象, 大幅提高了處理數據的速度, 並且提供了更穩健的與其它資料庫對象間的介面。
一、數據重塑 tbl_df()
# 觀察數據> dim(hflights)[1] 227496 21 # 21個變數,22W多條數據,因此需要在分析前先對原數據集進行重塑
> library(dplyr)> mtcars_df <- tbl_df(mtcars)> mtcars_df# A tibble: 32 × 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.0 6 160.0 110 3.90 2.620 16.46 0 1 4 42 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 43 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 14 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 15 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2# ... with 22 more rows
二、基礎數據操作
1. 篩選 filter()
> filter(mtcars,am==1,mpg <20) # 且的關係(篩選條件可無限增加)
> filter(mtcars,am==1|mpg <20) # 或的關係
2. 排列 arrange()
> arrange(mtcars,am,gear,carb) # 全部默認正序排列
> arrange(mtcars,am,desc(gear)) # desc()部分倒序排列
3. 選擇 select()
# 選取部分列構建新表> select(mtcars,mpg,am)
# 把列名按數字對待:選取mtcars數據集中am至carb列> select(mtcars,am:carb)
# 排除列> select(mtcars,-(am:carb))
4. 變形 mutate()
# 原數據集新增加一列num,為mpg與hp之和> mutate(mtcars,num=mpg+hp)
# 在同一語句中對剛增加的列進行操作:> mutate(mtcars,num1=mpg+hp,num2=num1-qsec)
5. 分組 group_by()
> by_cyl <- group_by(mtcars, cyl)# 按照cyl的分組計算disp和hp的均值> summarise(by_cyl, mean(disp), mean(hp))# A tibble: 3 × 3 cyl `mean(disp)` `mean(hp)` <dbl> <dbl> <dbl>1 4 105.1364 82.636362 6 183.3143 122.285713 8 353.1000 209.21429
# 以cyl分組基礎上,得出cyl在不同水平下的disp的最大值> filter(by_cyl, disp == max(disp))Source: local data frame [3 x 11]Groups: cyl [3] mpg cyl disp hp drat wt qsec vs am gear carb <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>1 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 12 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 23 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
6. 變數重命名 rename()
> rename(tbl_mtcars,mpg1=mpg)
7. 數據聚合 summarise()
在資料庫操作中,往往需要應用聚合函數實現數據集的聚合操作與展現。
# 將mpg方差、disp均值,wt最大值等等聚合在一起表現出來> summarise(tbl_mtcars,sd(mpg),mean(disp),max(wt),n_distinct(am))# A tibble: 1 × 4 `sd(mpg)` `mean(disp)` `max(wt)` `n_distinct(am)` <dbl> <dbl> <dbl> <int>1 6.026948 230.7219 5.424 2
分組聚合:
# 以cyl的不同水平為分組標準進行數據聚合> summarise(group_by(tbl_mtcars,cyl),sd(mpg),mean(disp),max(wt))# A tibble: 3 × 4 cyl `sd(mpg)` `mean(disp)` `max(wt)` <dbl> <dbl> <dbl> <dbl>1 4 4.509828 105.1364 3.1902 6 1.453567 183.3143 3.4603 8 2.560048 353.1000 5.424
8. 數據關聯 join()
內聯:inner_join 左聯:left_join右聯:right_join 全聯:full_joinsemi_join:返回能夠與y表匹配的x表的所有記錄anti_join:返回無法與y表匹配的x表的所有記錄
# 示例> inner_join(x = data1, y = data2, by = "var1")
9. 數據合併 bind_cols() & bind_rows()
# 數據表需要有相同的列數> bind_rows(data1, data2)# 數據表需要有相同的行數> bind_cols(data1, data2)
10. 管道函數 %>%
dplyr包特有,即通過%>%將上一個函數的輸出作為下一個函數的輸入,免寫數據名。
> group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp))# A tibble: 3 × 3 cyl `mean(disp)` `mean(hp)` <dbl> <dbl> <dbl>1 4 105.1364 82.636362 6 183.3143 122.285713 8 353.1000 209.21429
11. 隨機 or 非隨機
非隨機性選取部分列:slice()
> slice(mtcars,1:10)
隨機選取樣本:sample_n()
# 選取10個樣本> sample_n(mtcars,10)# 選取10%的樣本> sample_frac(mtcars,0.1)
12. 計數函數:count()
# 按照mtcars_df的am與cyl的不同水平進行計數統計> count(mtcars_df,am,cyl)Source: local data frame [6 x 3]Groups: am [?] am cyl n <dbl> <dbl> <int>1 0 4 32 0 6 43 0 8 124 1 4 85 1 6 36 1 8 2
三、外部資料庫連接(MySQL)
# 前提準備> library(RMySQL)
# 資料庫連接> test <- src_mysql("qwer", host = NULL, port = 0L, user = "root", password = "123456")
# 獲取數據集 tbl()# 提取test數據集中的q1數據表> data_mysql <- tbl(test,from="q1")
> data_mysqlSource: query [?? x 6]Database: mysql 5.5.22 [root@localhost:/qwer] id name sex age city address <int> <chr> <chr> <int> <chr> <chr>1 1 甲 男 25 北京 朝陽2 2 乙 女 12 北京 海淀3 3 丙 男 23 北京 東城4 4 丁 女 14 上海 徐匯5 5 戊 男 30 廣州 越秀
附學習文檔:
- dplyr tutorial
- Introduction to dplyr
- dplyr 0.5.0 | RStudio Blog
- Data Manipulation with dplyr
- Introduction to dplyr for Faster Data Manipulation in R
推薦閱讀:
※快播CEO王欣快出獄了,當年舉報他的那個人面臨的是?
※信息圖表高仿——R語言仿一財經典線條比較圖
※搞懂5種數據可視化方法,勝任90%熱門信息圖設計