【譯文】利用dplyr包進行數據操作
【譯文】利用dplyr包進行數據操作
作者 Teja Kodali
譯者 錢亦欣
dplyr是R中用來進行數據操作的一個包,由Hadley Wickham(男神!)編寫維護。它提供了一些功能強大,易于使用的函數,這些函數對于數據探索分析和數據操作而言非常實用。在本文中我將對這些常用函數做一個基本的概述。
我將使用包中自帶的空氣質量數據集做示例。這個數據集包含了紐約從1973年5月到1973年9月的空氣質量測量數據。
該數據集前幾行是這樣的:
head(airquality) Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 6 28 NA 14.9 66 5 6
在介紹函數之前,先讓我們加載兩個包
library(datasets) library(dplyr)
準備完畢,來看看函數吧!
Filter
filter()函數會返回滿足設定條件的觀測數據(行),舉個例子,我們可以用如下方法返回Temp變量值大于70的觀測:
filter(airquality, Temp > 70) Ozone Solar.R Wind Temp Month Day 1 36 118 8.0 72 5 2 2 12 149 12.6 74 5 3 3 7 NA 6.9 74 5 11 4 11 320 16.6 73 5 22 5 45 252 14.9 81 5 29 6 115 223 5.7 79 5 30 ...
也可以設置多個過濾條件。下方的例子會返回Temp大于80并且Month大于5的子集。
filter(airquality, Temp > 80 & Month > 5) Ozone Solar.R Wind Temp Month Day 1 NA 186 9.2 84 6 4 2 NA 220 8.6 85 6 5 3 29 127 9.7 82 6 7 4 NA 273 6.9 87 6 8 5 71 291 13.8 90 6 9 6 39 323 11.5 87 6 10 ...
Mutate()
Mutate()函數可以給數據集添加新變量。比如,可以在表中添加新的一列,記錄用攝氏度表示的溫度數據。
mutate(airquality, TempInC = (Temp - 32) * 5 / 9) Ozone Solar.R Wind Temp Month Day TempInC 1 41 190 7.4 67 5 1 19.44444 2 36 118 8.0 72 5 2 22.22222 3 12 149 12.6 74 5 3 23.33333 4 18 313 11.5 62 5 4 16.66667 5 NA NA 14.3 56 5 5 13.33333 ...
Summarise
summarise()是用來將多個變量總結成單個變量的函數。將它和dplyr包中的其他函數組合使用可謂威力無窮。如下所示,na.rm=TRUE設置會在計算均值時剔除所有NA的觀測,防止返回異常結果。
summarise(airquality, mean(Temp, na.rm = TRUE)) mean(Temp) 1 77.88235
Group By
group_by()函數可以把數據集根據一個或多個變量進行分組。比如可以根據月份把數據分組,并用summarise()函數計算每個組的溫度均值。
summarise(group_by(airquality, Month), mean(Temp, na.rm = TRUE)) Month mean(Temp) 1 5 65.54839 2 6 79.10000 3 7 83.90323 4 8 83.96774 5 9 76.90000
Sample
sample()函數可以從表格中隨機抽取一定數量的行(觀測)。下述第一行代碼從數據集中隨機抽取了10行,第二行代碼隨機抽取了15行(153個觀測的10%)。
sample_n(airquality, size = 10) sample_frac(airquality, size = 0.1)
Count
count()函數會在數據分好組的基礎上進行計數。這個函數功能和base包的table()有些類似。例子如下:
count(airquality, Month) Month n 1 5 31 2 6 30 3 7 31 4 8 31 5 9 30
輸出結果表示,5月份有31個觀測,6月有30個觀測,等等。
Arrange
arrange()函數可以按照變量值對觀測進行排序。當前情況下,空氣質量數據集是按照月份(Month)進行排序,每個月的數據在按照日期(Day)排序。我們可以用arrange函數將數據集按照月份降序排列,再逐月按照日期升序排列。
arrange(airquality, desc(Month), Day) Ozone Solar.R Wind Temp Month Day 1 96 167 6.9 91 9 1 2 78 197 5.1 92 9 2 3 73 183 2.8 93 9 3 4 91 189 4.6 93 9 4 5 47 95 7.4 87 9 5 6 32 92 15.5 84 9 6
Pipe(管道操作符)
R中的管道操作符為%>%,這個符號可以把一系列操作函數鏈接起來。(譯者注:管道操作符%>%會將不同指令連接起來。%>%符號會把左邊的輸出傳遞到右邊的函數,作為右側函數的第一個參數。)當你對一個數據集進行連續操作時利用管道操作符非常有用,它可以讓你不用逐步記錄每一次操作的輸出。
舉個例子,如果我們想要移除數據集中5月份的觀測,并將觀測按月份排序,再機選每個月的平均溫度。傳統的方法可能要把代碼寫成這樣:
filteredData <- filter(airquality, Month != 5) groupedData <- group_by(filteredData, Month) summarise(groupedData, mean(Temp, na.rm = TRUE))
利用管道操作符,上述代碼可以重寫為:
airquality %>% filter(Month != 5) %>% group_by(Month) %>% summarise(mean(Temp, na.rm = TRUE))
這是一個非常基礎的例子,管道操作的便利性可能無法體現。但只要對于數據的操作數越來越多,管道操作的優勢將會逐步體現。
到這里本文就要結束了。我希望你們能享受閱讀的過程,并且認為dplyr包真的實用。如果你有任何問題,請在下方自由留言或訪問我的 推特 。