dplyr包

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ǔ)句

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏燕,一起剝皮案震驚了整個(gè)濱河市钥屈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坝辫,老刑警劉巖篷就,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異近忙,居然都是意外死亡竭业,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門及舍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)未辆,“玉大人,你說(shuō)我怎么就攤上這事锯玛「拦瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵攘残,是天一觀的道長(zhǎng)拙友。 經(jīng)常有香客問(wèn)我,道長(zhǎng)歼郭,這世上最難降的妖魔是什么遗契? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮病曾,結(jié)果婚禮上牍蜂,老公的妹妹穿的比我還像新娘。我一直安慰自己泰涂,他們只是感情好鲫竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著负敏,像睡著了一般贡茅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天顶考,我揣著相機(jī)與錄音赁还,去河邊找鬼。 笑死驹沿,一個(gè)胖子當(dāng)著我的面吹牛艘策,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渊季,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朋蔫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了却汉?” 一聲冷哼從身側(cè)響起驯妄,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎合砂,沒(méi)想到半個(gè)月后青扔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翩伪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年微猖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缘屹。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凛剥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轻姿,到底是詐尸還是另有隱情犁珠,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布互亮,位于F島的核電站盲憎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胳挎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一溺森、第九天 我趴在偏房一處隱蔽的房頂上張望慕爬。 院中可真熱鬧,春花似錦屏积、人聲如沸医窿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姥卢。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間独榴,已是汗流浹背僧叉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棺榔,地道東北人瓶堕。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像症歇,于是被迫代替她去往敵國(guó)和親郎笆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容