1展融、背景簡介
在數(shù)據(jù)分析工作中蜗搔,經(jīng)常需要對原始的數(shù)據(jù)集進行清洗供鸠、整理以及變換畦贸。常用的數(shù)據(jù)整理與變換工作主要包括:特定分析變量的選取、滿足條件的數(shù)據(jù)記錄的篩選楞捂、按某一個或幾個變量排序薄坏、對原始變量進行加工處理并生成新的變量趋厉、對數(shù)據(jù)進行匯總以及分組匯總,比如計算各組的平均值等颤殴。
其實觅廓,上述的數(shù)據(jù)處理與變換工作在任何一種SQL語言(如Oracle,MySQL)中都非常容易處理涵但,但是R語言作為一門編程語言织阳,如何高效地完成上述類似SQL語言的數(shù)據(jù)處理功能?本文介紹的R語言dplyr
包正是這方面工作的有力武器之一惭嚣。
dplyr
包是 Hadley Wickham (ggplot2
包的作者饭望,被稱作“一個改變R的人”)的杰作, 并自稱 a grammar of data manipulation, 他將原本plyr
包中的ddply()
等函數(shù)進一步分離強化,專注接受dataframe
對象, 大幅提高了速度, 并且提供了更穩(wěn)健的與其它數(shù)據(jù)庫對象間的接口。
本文試圖對該dplyr
包的一些基礎(chǔ)且常用的功能做簡要介紹澈侠。主要包括:
- 變量篩選函數(shù)
select
- 記錄篩選函數(shù)
filter
- 排序函數(shù)
arrange
- 變形(計算)函數(shù)
mutate
- 匯總函數(shù)
summarize
- 分組函數(shù)
group_by
- 多步操作連接符
%>%
- 隨機抽樣函數(shù)
sample_n
,sample_frac
2劫侧、dplyr
包使用介紹
2.1 dplyr
包的安裝加載與示例數(shù)據(jù)準備
安裝dplyr
包。
install.packages("dplyr")
library(dplyr)
安裝hflights
包哨啃,該軟件包中的飛機航班數(shù)據(jù)將用于本文中dplyr
包各個函數(shù)的演示烧栋。
install.packages("hflights")
library(hflights)
通過以下代碼,簡單了解示例數(shù)據(jù)集hflights
拳球。
class(hflights);dim(hflights)
head(hflights)
輸出結(jié)果如下:
hflights
是一個data.frame類型的對象审姓,包含227496條數(shù)據(jù)記錄、21個變量祝峻,head
函數(shù)展示了前6條數(shù)據(jù)記錄魔吐。
在利用dplyr
包處理數(shù)據(jù)之前,需要將數(shù)據(jù)裝載成dplyr
包的一個特定對象類型(data frame tbl / tbl_df)莱找,也稱作 tibble 類型酬姆,可以用 tbl_df
函數(shù)將數(shù)據(jù)框類型的數(shù)據(jù)裝載成 tibble 類型的數(shù)據(jù)對象。
packageVersion("dplyr")
tbl_hflights<-tbl_df(hflights)
class(tbl_hflights)
tbl_hflights
輸出結(jié)果如下:可以看到奥溺,將hflights轉(zhuǎn)換成tbl_df類型后辞色,R語言打印數(shù)據(jù)集tbl_hflights的數(shù)據(jù)時,僅打印了適合屏幕寬度的數(shù)據(jù)谚赎,屏幕顯示不下的剩余兩個變量的數(shù)據(jù)(CancellationCode , Diverted )并沒有打印出來淫僻,這使得屏幕上打印出來的數(shù)據(jù)可讀性更強,也更美觀壶唤。此外雳灵,還在每一列變量名稱的下面顯示了變量的類型。
==p.s. 可以用packageVersion
函數(shù)查看dplyr
包的版本==
2.2 變量篩選select
select
函數(shù)可以通過指定列名選擇指定的變量進行分析闸盔。
# 選擇制定的變量
select(tbl_hflights,Year,Month,DayofMonth,FlightNum,Distance)
# 用類似于生成數(shù)字序列的方式選擇變量
# 選擇Year開始一直到ArrTime結(jié)束的所有變量
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))
2.3 數(shù)據(jù)記錄篩選filter
filter
函數(shù)按照指定的條件篩選符合條件中邏輯判斷要求的數(shù)據(jù)記錄,類似于SQL語句中的where
語句中的篩選條件。
# 選擇2011年1月而且起飛時間為1400的所有數(shù)據(jù)記錄
filter(tbl_hflights,Year == 2011, Month == 1, DepTime == 1400)
# '且'的關(guān)系也可以用&符號表示躲撰,也就是列出的所有條件同時滿足
filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400)
# 選擇起飛時間在1400之前的航班
filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime <= 1400)
# '或'的關(guān)系用|符號表示针贬。選擇起飛時間為1400或者1430的航班,且UniqueCarrier為'AA'
filter(tbl_hflights,Year == 2011 & Month == 1 & (DepTime == 1400 | DepTime == 1430) & UniqueCarrier == 'AA')
上述R語句輸出結(jié)果如下:
2.4 數(shù)據(jù)排序arrange
arrange
函數(shù)按給定的列名進行排序,默認為升序排列拢蛋,也可以對列名加desc()
進行降序排序桦他。
tbl_hflights1<-select(filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400),Year:ArrTime,AirTime)
# 將數(shù)據(jù)按照ArrTime升序排序
arrange(tbl_hflights1,ArrTime)
# 將數(shù)據(jù)先按照AirTime降序,再按照ArrTime升序排列
arrange(tbl_hflights1,desc(AirTime),ArrTime)
上述R語句輸出結(jié)果如下:
2.5 變量變換/重構(gòu)mutate
mutate
函數(shù)可以基于原始變量重新計算得到新的變量谆棱,在做數(shù)據(jù)分析預處理的時候經(jīng)常會用到該功能快压。
# 由ArrTime-DepTime得到航班的飛行所用時長,并存儲在DurTime變量中
# 飛行所用時長(單位:分鐘)的計算方式為:小時數(shù)*60+分鐘數(shù)
# 同時將飛行的分鐘數(shù)垃瞧,換算成秒蔫劣。
# 優(yōu)勢在于可以在同一語句中對剛增加的列進行操作。
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語句輸出結(jié)果如下:
2.6 數(shù)據(jù)匯總summarize
summarize
函數(shù)實現(xiàn)對數(shù)據(jù)的匯總个从,比如求和脉幢、計算平均值等。
# 計算航班平均飛行時長
summarize(tbl_hflights2,avg_dur = mean(DurTime),sum_air = sum(AirTime))
上述R語句輸出結(jié)果如下:
2.7 數(shù)據(jù)分組group_by
group_by
函數(shù)實現(xiàn)對數(shù)據(jù)進行分組嗦锐,結(jié)合summarize
函數(shù)嫌松,可以對分組數(shù)據(jù)進行匯總統(tǒng)計。
# 按照航空公司分組進行匯總
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語句輸出結(jié)果如下:
2.8 多步操作連接符%>%
dplyr
包里還新引進了一個操作符,%>%
, 使用時把數(shù)據(jù)集名作為開頭, 然后依次對此數(shù)據(jù)進行多步操作奕污。
這種運算符的編寫方式使得編程者可以按數(shù)據(jù)處理時的思路寫代碼, 一步一步操作不斷疊加豆瘫,在程序上就可以非常清晰的體現(xiàn)數(shù)據(jù)處理的步驟與背后的邏輯。
# 對數(shù)據(jù)進行分布處理:分組-匯總-排序-打印
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語句輸出結(jié)果如下:
2.9 挑選隨機樣本sample_n, sample_frac
sample_n
隨機選出指定個數(shù)(樣本容量)的樣本數(shù)菊值;sample_frac
隨機選出指定百分比(占整個數(shù)據(jù)集總體百分比)的樣本數(shù)。
# 隨機抽取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語句輸出結(jié)果如下:
3育灸、參考文獻與其他學習資料
3.1 dplyr
包中自帶的參考資料查看
可以通過如下名稱查看dplyr
包中自帶的參考資料腻窒。
# 查看自帶的參考資料
vignette(package = "dplyr")
vignette("introduction", package = "dplyr")
3.2 本文寫作用到的參考鏈接
R語言擴展包dplyr筆記
R語言擴展包dplyr——數(shù)據(jù)清洗和整理