在R裡面處理數據前處理時,dplyr 是非常強大的一個封包,其主要設計的理念有三個:
- 整合所有在前處理數據會常用的“邏輯”,變成簡單易懂的函數,比如:過濾特定行、針對特定行資料作出彙整等等。
- 底層使用c++撰寫,讓其處理時速度較快
- 其在“輸入”的檔案支持性良好,支持多種資料庫的串接
dplyr是由Hadley Wickham開發的,承接plyr的邏輯。語法上加入pipeline的概念,可以寫得非常精簡。
dplyr package 最重要的5個函數,其實就代表在資料前處理的普遍操作
- select
- filter
- arrange
- mutate
- 以現有的column資料做運算,形成新的column
- summarise
當然新版本的dplyr其實會把輸入的檔案,轉換成tbl/tibble的格式,在資料呈現和內建的處理邏輯會有些不同,可能要小心,這邊寫其中一個用原生data.frame處理邏輯轉入到使用dplyr可能會遇到的。隨者使用tidyverse的包越來越多,會發現Hadley Wickham有一套很棒的計畫在逐漸把R原生的"較不直覺的"語法改進。
以下分別示範在dplyr中這幾個用法:
使用常用的mtcars資料集做示範:
select
data("mtcars")
mtcars %>% str()
這筆資料由Motor Trend US 雜誌所提供,總共有32部介於1973-74年出產的汽車其性能的資訊。


Select :挑選特定欄位進行分析,其利害的地方其實是這個函數的子函數:
- starts_with() 挑選欄位名稱開頭有""字串的欄位
- ends_with() 挑選欄位名稱結尾有""字串的欄位
- contains() 挑選欄位名稱中包含""字串的欄位
- matches() 挑選欄位名稱符合""字串的欄位
select(mtcars, starts_with("m"))
select(mtcars, ends_with("b"))
select(mtcars, contains("ra"))
select(mtcars, matches("a"))
select(mtcars, disp, am)
Filter: 根據特定條件篩選資料
filter的使用就蠻直覺的,可以直接在後面接logical條件,且可以直接使用欄位名稱
filter(mtcars, cyl == 8)
filter(mtcars, cyl < 6)
# Multiple criteria
filter(mtcars, cyl < 6 & vs == 1)
filter(mtcars, cyl < 6 | vs == 1)
# Multiple arguments are equivalent to and
filter(mtcars, cyl < 6, vs == 1)
這邊整理filter可以使用的一些“logic”表示法
| Logic symbol |
| == |
等於 |
| != |
不等於 |
| > |
大於 |
| < |
小於 |
| %in% |
包含於 |
| is.na() |
是否為NA值 |
Arrange: 將資料根據特定欄位來排序
預設是將數值由小到大排下去,假如有NA值的話,直接排最後,使用desc則變成由大到小,其本身支持multiple arrange
arrange(mtcars, cyl, disp)
arrange(mtcars, desc(disp))
Mutate:由已有的行經過“處理(加減乘除等等)”,產生新的行
mutate(mtcars, displ_l = disp / 61.0237)
Summarise:總結行資料,形成單一值
summarise的函數,可能是需要多點練習,才會比較熟稔他的邏輯,其就是將資料進行sum, mean, median等等,原本r語言中,用來進階統計內建函數可以上場的時候。
summarise(mtcars, mean(disp))
summarise(group_by(mtcars, cyl), mean(disp))
summarise(group_by(mtcars, cyl), m = mean(disp), sd = sd(disp))
其實除了這五個基本函數外,dplyr封包中有很多進階的功能,可以進一步來活用!
這邊有Rstudio精心整理的cheat sheet,可以用來幫助學習