【譯文】利用dplyr包進行數據操作

Vivian27C 8年前發布 | 103K 次閱讀 dplyr R R語言

 

【譯文】利用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包真的實用。如果你有任何問題,請在下方自由留言或訪問我的 推特

注:原文刊載于datascience+網站

鏈接: http://datascienceplus.com/data-manipulation-with-dplyr/

來自: http://www.ituring.com.cn/article/214094

 本文由用戶 Vivian27C 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!