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 廣州 越秀

附學習文檔:

  1. dplyr tutorial

  2. Introduction to dplyr

  3. dplyr 0.5.0 | RStudio Blog
  4. Data Manipulation with dplyr

  5. Introduction to dplyr for Faster Data Manipulation in R

推薦閱讀:

快播CEO王欣快出獄了,當年舉報他的那個人面臨的是?
信息圖表高仿——R語言仿一財經典線條比較圖
搞懂5種數據可視化方法,勝任90%熱門信息圖設計

TAG:R编程语言 | 数据分析 | 数据处理 |