1.包和數(shù)據(jù)的安裝
安裝dplyr包
install.packages("dplyr")
library(dplyr)
安裝hflights包蒸痹,該軟件包中的飛機(jī)航班數(shù)據(jù)將用于本文中dplyr包各個(gè)函數(shù)的演示
install.packages("hflights")
library(hflights)
通過(guò)以下代碼块攒,簡(jiǎn)單了解示例數(shù)據(jù)集hflights
class(hflights);dim(hflights)
head(hflights)
在利用dplyr包處理數(shù)據(jù)之前,需要將數(shù)據(jù)裝載成dplyr包的一個(gè)特定對(duì)象類型(data frame tbl / tbl_df)安接,也稱作 tibble 類型她渴,可以用 tbl_df函數(shù)將數(shù)據(jù)框類型的數(shù)據(jù)裝載成 tibble 類型的數(shù)據(jù)對(duì)象
packageVersion("dplyr")
attach(hflights)
tbl_hflights<-tbl_df(hflights)
class(tbl_hflights)
tbl_hflights
輸出結(jié)果如下:可以看到,將hflights轉(zhuǎn)換成tbl_df類型后擂橘,R語(yǔ)言打印數(shù)據(jù)集tbl_hflights的數(shù)據(jù)時(shí),僅打印了適合屏幕寬度的數(shù)據(jù)摩骨,屏幕顯示不下的剩余兩個(gè)變量的數(shù)據(jù)(CancellationCode , Diverted )并沒(méi)有打印出來(lái)通贞,這使得屏幕上打印出來(lái)的數(shù)據(jù)可讀性更強(qiáng),也更美觀恼五。此外昌罩,還在每一列變量名稱的下面顯示了變量的類型。
2.數(shù)據(jù)記錄篩選filter
filter() 返回行的子集,按照指定的條件篩選符合條件中邏輯判斷要求的數(shù)據(jù)記錄灾馒,類似于SQL語(yǔ)句中的where語(yǔ)句中的篩選條件茎用,但不能篩選某些變量
# 選擇2011年1月而且起飛時(shí)間為1400的所有數(shù)據(jù)記錄
filter(tbl_hflights,Year == 2011, Month == 1, DepTime == 1400)
# '且'的關(guān)系除了","也可以用&符號(hào)表示睬罗,也就是列出的所有條件同時(shí)滿足
filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400)
# 選擇起飛時(shí)間在1400之前的航班
filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime <= 1400)
# '或'的關(guān)系用|符號(hào)表示轨功。選擇起飛時(shí)間為1400或者1430的航班,且UniqueCarrier為'AA'
filter(tbl_hflights,Year == 2011 & Month == 1 & (DepTime == 1400 | DepTime == 1430) & UniqueCarrier == 'AA')
3.變量篩選select
select()返回列的子集,filter()函數(shù)只能將指定條件的觀測(cè)篩選出來(lái),并不能篩選出只關(guān)心的變量容达,為了彌補(bǔ)這個(gè)缺陷古涧,select函數(shù)可以通過(guò)指定列名選擇指定的變量進(jìn)行分析,而且比subset()函數(shù)更靈活董饰,而且選擇變量的同時(shí)也可以重新命名變量蒿褂。
如果需要對(duì)數(shù)據(jù)集中的某些變量進(jìn)行重命名的話,可直接使用rename()函數(shù)卒暂,語(yǔ)法如下:rename(tbl, newname = oldname,...)
如果剔除某些變量的話啄栓,只需在變量前加上負(fù)號(hào)“-”。
Dplyr包有下列輔助函數(shù)也祠,用于在select()中選擇變量:
starts_with("X"): 以 "X"開(kāi)頭的變量名
ends_with("X"): 以 "X"結(jié)束的變量名
contains("X"): 包含 "X"的變量名
matches("X"): 匹配正則表達(dá)式“x"的變量名
num_range("x", 1:5): 變量名為 x01, x02, x03, x04 and x05
one_of(x): 出現(xiàn)在字符向量x中的所有變量名
everything(): 選擇所有變量昙楚,一般調(diào)整數(shù)據(jù)集中變量順序時(shí)使用
在select()中直接使用列時(shí)不需要引用"",但使用上述輔助函數(shù)時(shí)必須引用""
# 選擇指定的變量
select(tbl_hflights,Year,Month,DayofMonth,FlightNum,Distance)
# 用類似于生成數(shù)字序列的方式選擇變量
# 選擇Year開(kāi)始一直到ArrTime結(jié)束的所有變量
select(tbl_hflights,Year:ArrTime)
# 也可以按照倒過(guò)來(lái)的順序選擇
select(tbl_hflights,ArrTime:Year)
# 除了選擇變量诈嘿,也可以刪除指定的變量
select(tbl_hflights,-Year,-Month,-DayofMonth,-FlightNum,-Distance)
select(tbl_hflights,-(Year:ArrTime))
4.數(shù)據(jù)排序arrange
arrange根據(jù)一個(gè)或多個(gè)變量對(duì)行排序,默認(rèn)為升序排列堪旧,也可以對(duì)列名加desc()進(jìn)行降序排序削葱。
#抽取數(shù)據(jù)
tbl_hflights1<-select(filter(tbl_hflights,Year == 2011 & Month == 1 & DepTime == 1400),Year:ArrTime,AirTime)
tbl_hflights1
# 將數(shù)據(jù)按照ArrTime升序排序
arrange(tbl_hflights1,ArrTime)
# 將數(shù)據(jù)先按照AirTime降序,再按照ArrTime升序排列
arrange(tbl_hflights1,desc(AirTime),ArrTime)
5.變量變換/重構(gòu)mutate
mutate函數(shù)可以基于原始變量重新計(jì)算得到新的變量淳梦,應(yīng)用指定的公式析砸,派生新的數(shù)據(jù)列,或重寫(xiě)已經(jīng)存在的數(shù)據(jù)列,在做數(shù)據(jù)分析預(yù)處理的時(shí)候經(jīng)常會(huì)用到該功能爆袍。允許在同一次調(diào)用中使用新變量來(lái)創(chuàng)建下一個(gè)變量首繁。例如:mutate(my_df, x = a + b, y = x + c)
同樣可以進(jìn)行數(shù)據(jù)擴(kuò)展的還有transmute()函數(shù),與mutate()函數(shù)不同的是陨囊,該函數(shù)擴(kuò)展新變量的同時(shí)弦疮,將刪除所有原始變量。
由ArrTime-DepTime得到航班的飛行所用時(shí)長(zhǎng)蜘醋,并存儲(chǔ)在DurTime變量中,飛行所用時(shí)長(zhǎng)(單位:分鐘)的計(jì)算方式為:小時(shí)數(shù)*60+分鐘數(shù),同時(shí)將飛行的分鐘數(shù)胁塞,換算成秒。優(yōu)勢(shì)在于可以在同一語(yǔ)句中對(duì)剛增加的列進(jìn)行操作压语。
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
6.數(shù)據(jù)匯總summarize
summarize函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的匯總啸罢,比如求和、計(jì)算平均值等胎食。
對(duì)tbl對(duì)象執(zhí)行聚合運(yùn)算伺糠,還可以結(jié)合group_by()函數(shù)實(shí)現(xiàn)分組聚合,單獨(dú)對(duì)每個(gè)分組進(jìn)行聚合運(yùn)算斥季。
min():返回最小值
max():返回最大值
mean():返回均值
sum():返回總和
sd():返回標(biāo)準(zhǔn)差
var():方差
diff(range()):x值的范圍
median():返回中位數(shù)
quantile(x, p):x的第P個(gè)分位數(shù)
IQR():返回四分位極差
n():返回觀測(cè)個(gè)數(shù)
n_distinct():統(tǒng)計(jì)數(shù)據(jù)集中無(wú)重復(fù)值的數(shù)量
first():返回第一個(gè)觀測(cè)
last():返回最后一個(gè)觀測(cè)
nth():返回n個(gè)觀測(cè)
# 計(jì)算航班平均飛行時(shí)長(zhǎng)
summarize(tbl_hflights2,avg_dur = mean(DurTime),sum_air = sum(AirTime))
7.數(shù)據(jù)分組group_by
group_by函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行分組,結(jié)合summarize函數(shù)累驮,可以對(duì)分組數(shù)據(jù)進(jìn)行匯總統(tǒng)計(jì)酣倾。然后可以使用ungroup函數(shù),移除tbl對(duì)象的分組狀態(tài)
# 按照航空公司分組進(jìn)行匯總
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))
8.多步操作連接符%>%管道函數(shù)
是最常用的一個(gè)操作符谤专,就是把左側(cè)準(zhǔn)備的數(shù)據(jù)或表達(dá)式躁锡,傳遞給右側(cè)的函數(shù)調(diào)用或 表達(dá)式進(jìn)行運(yùn)行,可以連續(xù)操作就像一個(gè)鏈條一樣置侍。
使用時(shí)把數(shù)據(jù)名作為開(kāi)頭映之,然后依次對(duì)此數(shù)據(jù)進(jìn)行多步操作。
這種運(yùn)算符的編寫(xiě)方式使得編程者可以按數(shù)據(jù)處理時(shí)的思路寫(xiě)代碼, 一步一步操作不斷疊加蜡坊,在程序上就可以非常清晰的體現(xiàn)數(shù)據(jù)處理的步驟與背后的邏輯杠输。
# 對(duì)數(shù)據(jù)進(jìn)行分布處理:分組-匯總-排序-打印
tbl_hflights %>%
group_by(UniqueCarrier) %>%
summarize(m = mean(AirTime,na.rm = TRUE), sd = sd(AirTime,na.rm = TRUE)) %>%
arrange(desc(m),sd) %>%
head(10)
9.挑選隨機(jī)樣本sample_n, sample_frac
sample_n隨機(jī)選出指定個(gè)數(shù)(樣本容量)的樣本數(shù);sample_frac隨機(jī)選出指定百分比(占整個(gè)數(shù)據(jù)集總體百分比)的樣本數(shù)秕衙。
# 隨機(jī)抽取10個(gè)樣本
sample_n(tbl_hflights,10)
# 隨機(jī)抽取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))
10.
可以通過(guò)如下名稱查看dplyr包中自帶的參考資料
# 查看自帶的參考資料
vignette(package = "dplyr")
vignette("introduction", package = "dplyr")
11.連接操作 join
inner_join#內(nèi)連
left_join#左連
right_join#右連
full_join#全連
semi_join#返回能夠與y表匹配的x表所有記錄
anti_join#返回?zé)o法與y表匹配的x表的所有記錄
df <- data.frame(x = c('a','b','c','a','b','e','d','f'), y = c(1,2,3,4,5,6,7,8))
df
df2 <- data.frame(x = c('a','b','c'), z = c('A','B','C'))
df2
#轉(zhuǎn)換為tbl對(duì)象
df2tbl <- tbl_df(df)
df2tbl
df2tbl2 <- tbl_df(df2)
df2tbl2
inner_join(x = df2tbl, y = df2tbl2, by = 'x')
semi_join(x = df2tbl, y = df2tbl2, by = 'x')
anti_join(x = df2tbl, y = df2tbl2, by = 'x')
12.數(shù)據(jù)合并bind_rows/cols
在R基礎(chǔ)包里有cbind()函數(shù)和rbind()函數(shù)實(shí)現(xiàn)按列的方向進(jìn)行數(shù)據(jù)合并和按行的方向進(jìn)行數(shù)據(jù)合并蠢甲,而在dplyr包中也添加了類似功能的函數(shù),它們是bind_cols()函數(shù)和bind_rows()函數(shù)据忘。
mydf1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
mydf1
mydf2 <- data.frame(x = c(5,6), y = c(50,60))
mydf2
mydf3 <- data.frame(z = c(100,200,300,400))
mydf3
#bind_rows()函數(shù)需要兩個(gè)數(shù)據(jù)框或tbl對(duì)象有相同的列數(shù)
bind_rows(mydf1, mydf2)
#bind_cols()函數(shù)則需要兩個(gè)數(shù)據(jù)框或tbl對(duì)象有相同的行數(shù)
bind_cols(mydf1, mydf3)
13.集合操作set
#取兩個(gè)集合的交集
intersect(x,y, ...)
#取兩個(gè)集合的并集鹦牛,并進(jìn)行去重
union(x,y, ...)
#取兩個(gè)集合的并集搞糕,不去重
union_all(x,y, ...)
#取兩個(gè)集合的差集,在x中不在y中
setdiff(x,y, ...)
#判斷兩個(gè)集合是否相等
setequal(x, y, ...)
14.連接數(shù)據(jù)庫(kù)數(shù)據(jù)
如果需要獲取MySQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)曼追,可以直接使用dplyr包中的src_mysql()函數(shù)窍仰,其功能類似于RMySQL包。src_mysql()函數(shù)語(yǔ)法如下:
src_mysql(dbname, host = NULL, port = 0L, user = "root", password = "",...)
通過(guò)以上方式連接MySQL數(shù)據(jù)庫(kù)后礼殊,使用tbl()函數(shù)獲取數(shù)據(jù)集驹吮,tbl()函數(shù)語(yǔ)法如下:
tbl(src,from = '')
其中src為src_mysql()函數(shù)對(duì)象,from為SQL語(yǔ)句