在R裡面處理數據前處理時,dplyr 是非常強大的一個封包,其主要設計的理念有三個:
- 整合所有在前處理數據會常用的“邏輯”,變成簡單易懂的函數,比如:過濾特定行、針對特定行資料作出彙整等等。
- 底層使用c++撰寫,讓其處理時速度較快
- 其在“輸入”的檔案支持性良好,支持多種資料庫的串接
dplyr是由Hadley Wickham開發的,承接plyr的邏輯。語法上加入pipeline的概念,可以寫得非常精簡。
dplyr package 最重要的5個函數,其實就代表在資料前處理的普遍操作
- select
- 挑選特定column出來
- filter
- 自訂條件濾掉column中的資料
- arrange
- 調整row排列順序
- 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封包中有很多進階的功能,可以進一步來活用!