R語言代寫dplyr-高效的數據變換與整理工具


 1、背景簡介

在數據分析工作中,經常需要對原始的數據集進行清洗、整理以及變換。常用的數據整理與變換工作主要包括:特定分析變量的選取、滿足條件的數據記錄的篩選、按某一個或幾個變量排序、對原始變量進行加工處理並生成新的變量、對數據進行匯總以及分組匯總,比如計算各組的平均值等。

其實,上述的數據處理與變換工作在任何一種SQL語言(如Oracle,MySQL)中都非常容易處理,但是R語言作為一門編程語言,如何高效地完成上述類似SQL語言的數據處理功能?本文介紹的R語言dplyr包正是這方面工作的有力武器之一。

dplyr包是 Hadley Wickham (ggplot2包的作者,被稱作“一個改變R的人”)的傑作, 並自稱 a grammar of data manipulation, 他將原本plyr 包中的ddply()等函數進一步分離強化,專注接受dataframe對象, 大幅提高了速度, 並且提供了更穩健的與其它數據庫對象間的接口。

本文試圖對該dplyr包的一些基礎且常用的功能做簡要介紹。主要包括:

  1. 變量篩選函數 select
  2. 記錄篩選函數 filter
  3. 排序函數 arrange
  4. 變形(計算)函數 mutate
  5. 匯總函數 summarize
  6. 分組函數 group_by
  7. 多步操作連接符 %>%
  8. 隨機抽樣函數 sample_n,sample_frac

001.png

2、dplyr包使用介紹 2.1 dplyr包的安裝加載與示例數據准備

安裝dplyr包。

install.packages("dplyr") library(dplyr)

安裝hflights包,該軟件包中的飛機航班數據將用於本文中dplyr包各個函數的演示。

install.packages("hflights") library(hflights)

通過以下代碼,簡單了解示例數據集hflights。

class(hflights);dim(hflights) head(hflights)

輸出結果如下:hflights是一個data.frame類型的對象,包含227496條數據記錄、21個變量,head函數展示了前6條數據記錄。

03.png

在利用dplyr包處理數據之前,需要將數據裝載成dplyr包的一個特定對象類型(data frame tbl / tbl_df),也稱作 tibble 類型,可以用 tbl_df函數將數據框類型的數據裝載成 tibble 類型的數據對象。

packageVersion("dplyr") tbl_hflights<-tbl_df(hflights) class(tbl_hflights) tbl_hflights

輸出結果如下:可以看到,將hflights轉換成tbl_df類型后,R語言打印數據集tbl_hflights的數據時,僅打印了適合屏幕寬度的數據,屏幕顯示不下的剩余兩個變量的數據(CancellationCode , Diverted )並沒有打印出來,這使得屏幕上打印出來的數據可讀性更強,也更美觀。此外,還在每一列變量名稱的下面顯示了變量的類型。

04.png

==p.s. 可以用packageVersion函數查看dplyr包的版本==

2.2 變量篩選select

select函數可以通過指定列名選擇指定的變量進行分析。

# 選擇制定的變量 select(tbl_hflights,Year,Month,DayofMonth,FlightNum,Distance) # 用類似於生成數字序列的方式選擇變量 # 選擇Year開始一直到ArrTime結束的所有變量 3:10 select(tbl_hflights,Year:ArrTime) # 也可以按照倒過來的順序選擇 select(tbl_hflights,ArrTime:Year) # 除了選擇變量,也可以刪除指定的變量 select(tbl_hflights,-Year,-Month,-DayofMonth,-FlightNum,-Distance) select(tbl_hflights,-(Year:ArrTime))

05.png

06.png

07.png

08.png

09.png

2.3 數據記錄篩選filter

filter函數按照指定的條件篩選符合條件中邏輯判斷要求的數據記錄,類似於SQL語句中的where語句中的篩選條件。

# 選擇2011年1月而且起飛時間為1400的所有數據記錄 filter(tbl_hflights,Year == 2011, Month == 1, DepTime == 1400) # '且'的關系也可以用&符號表示,也就是列出的所有條件同時滿足 filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400) # 選擇起飛時間在1400之前的航班 filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime <= 1400) # '或'的關系用|符號表示。選擇起飛時間為1400或者1430的航班,且UniqueCarrier為'AA' filter(tbl_hflights,Year == 2011 & Month == 1 & (DepTime == 1400 | DepTime == 1430) & UniqueCarrier == 'AA')

上述R語句輸出結果如下:

10.png

11.png

12.png

13.png

2.4 數據排序arrange

arrange函數按給定的列名進行排序,默認為升序排列,也可以對列名加desc()進行降序排序。

tbl_hflights1<-select(filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400),Year:ArrTime,AirTime) # 將數據按照ArrTime升序排序 arrange(tbl_hflights1,ArrTime) # 將數據先按照AirTime降序,再按照ArrTime升序排列 arrange(tbl_hflights1,desc(AirTime),ArrTime)

上述R語句輸出結果如下:

14.png

15.png

2.5 變量變換/重構mutate

mutate函數可以基於原始變量重新計算得到新的變量,在做數據分析預處理的時候經常會用到該功能。

# 由ArrTime-DepTime得到航班的飛行所用時長,並存儲在DurTime變量中 # 飛行所用時長(單位:分鍾)的計算方式為:小時數*60+分鍾數 # 同時將飛行的分鍾數,換算成秒。 # 優勢在於可以在同一語句中對剛增加的列進行操作。 tbl_hflights2<-mutate(tbl_hflights1, DurTime = (as.numeric(substr(ArrTime,1,2)) - as.numeric(substr(DepTime,1,2)))*60 + as.numeric(substr(ArrTime,3,4)) , Dur_Time1 = DurTime * 60) tbl_hflights2

上述R語句輸出結果如下:

16.png

2.6 數據匯總summarize

summarize函數實現對數據的匯總,比如求和、計算平均值等。

# 計算航班平均飛行時長 summarize(tbl_hflights2,avg_dur = mean(DurTime),sum_air = sum(AirTime))

上述R語句輸出結果如下:

18.png

2.7 數據分組group_by

group_by函數實現對數據進行分組,結合summarize函數,可以對分組數據進行匯總統計。

# 按照航空公司分組進行匯總 summarise(group_by(tbl_hflights, UniqueCarrier), m = mean(AirTime,na.rm = TRUE), sd = sd(AirTime,na.rm = TRUE), cnt = n(), me = median(AirTime,na.rm = TRUE))

上述R語句輸出結果如下:

19.png

2.8 多步操作連接符%>%

dplyr包里還新引進了一個操作符,%>%, 使用時把數據集名作為開頭, 然后依次對此數據進行多步操作。這種運算符的編寫方式使得編程者可以按數據處理時的思路寫代碼, 一步一步操作不斷疊加,在程序上就可以非常清晰的體現數據處理的步驟與背后的邏輯。

# 對數據進行分布處理:分組-匯總-排序-打印 tbl_hflights %>% group_by(UniqueCarrier) %>% summarize(m = mean(AirTime,na.rm = TRUE), sd = sd(AirTime,na.rm = TRUE)) %>% arrange(desc(m),sd) %>% head(10)

上述R語句輸出結果如下:

20.png

2.9 挑選隨機樣本sample_n, sample_frac

sample_n隨機選出指定個數(樣本容量)的樣本數;sample_frac隨機選出指定百分比(占整個數據集總體百分比)的樣本數。

# 隨機抽取10個樣本 sample_n(tbl_hflights,10) # 隨機抽取10%的樣本 tbl_hflights %>% sample_frac(0.1) %>% select(Year:UniqueCarrier) %>% group_by(UniqueCarrier) %>% summarize(m = mean(ArrTime,na.rm = TRUE), cnt = n()) %>% arrange(desc(m))

上述R語句輸出結果如下:

21.png

22.png

3、參考文獻與其他學習資料 3.1 dplyr包中自帶的參考資料查看

可以通過如下名稱查看dplyr包中自帶的參考資料。

# 查看自帶的參考資料 vignette(package = "dplyr") vignette("introduction", package = "dplyr")

23.png

24.png

3.2 本文寫作用到的參考鏈接

R語言擴展包dplyr筆記R語言擴展包dplyr——數據清洗和整理

3.3 RStudio官網的cheatsheet

data-wrangling-cheatsheet

26.png

 

 

如果您有任何疑問,請在下面發表評論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM