R語言滴水穿石系列文章(一):dplyr-高效的數(shù)據(jù)變換與整理工具

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ǔ)且常用的功能做簡要介紹澈侠。主要包括:

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

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ù)記錄魔吐。

03.png

在利用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ù)可讀性更強,也更美觀壶唤。此外雳灵,還在每一列變量名稱的下面顯示了變量的類型。

04.png

==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))
05.png

06.png

07.png

08.png

09.png

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é)果如下:


10.png

11.png

12.png

13.png

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é)果如下:

14.png

15.png

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é)果如下:

16.png

2.6 數(shù)據(jù)匯總summarize

summarize函數(shù)實現(xiàn)對數(shù)據(jù)的匯總个从,比如求和脉幢、計算平均值等。

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

上述R語句輸出結(jié)果如下:


18.png

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é)果如下:

19.png

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é)果如下:

20.png

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é)果如下:

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——數(shù)據(jù)清洗和整理

3.3 RStudio官網(wǎng)的cheatsheet

data-wrangling-cheatsheet

26.png
25.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磅崭,隨后出現(xiàn)的幾起案子儿子,更是在濱河造成了極大的恐慌,老刑警劉巖砸喻,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柔逼,死亡現(xiàn)場離奇詭異,居然都是意外死亡割岛,警方通過查閱死者的電腦和手機愉适,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癣漆,“玉大人维咸,你說我怎么就攤上這事。” “怎么了癌蓖?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵瞬哼,是天一觀的道長。 經(jīng)常有香客問我租副,道長坐慰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任用僧,我火速辦了婚禮结胀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘永毅。我一直安慰自己把跨,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布沼死。 她就那樣靜靜地躺著着逐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪意蛀。 梳的紋絲不亂的頭發(fā)上耸别,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音县钥,去河邊找鬼秀姐。 笑死,一個胖子當著我的面吹牛若贮,可吹牛的內(nèi)容都是我干的省有。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谴麦,長吁一口氣:“原來是場噩夢啊……” “哼蠢沿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匾效,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舷蟀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后面哼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體野宜,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年魔策,在試婚紗的時候發(fā)現(xiàn)自己被綠了匈子。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡代乃,死狀恐怖旬牲,靈堂內(nèi)的尸體忽然破棺而出仿粹,到底是詐尸還是另有隱情,我是刑警寧澤原茅,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布吭历,位于F島的核電站,受9級特大地震影響擂橘,放射性物質(zhì)發(fā)生泄漏晌区。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一通贞、第九天 我趴在偏房一處隱蔽的房頂上張望朗若。 院中可真熱鬧,春花似錦昌罩、人聲如沸哭懈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遣总。三九已至,卻和暖如春轨功,著一層夾襖步出監(jiān)牢的瞬間旭斥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工古涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垂券,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓羡滑,卻偏偏與公主長得像菇爪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柒昏,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法娄帖,類相關(guān)的語法,內(nèi)部類的語法昙楚,繼承相關(guān)的語法,異常的語法诈嘿,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 1 時隔二十多年奖亚,雨薇的初戀男友通過萬能的微信淳梦,終于聯(lián)系上了雨薇。此時昔字,她在南方...
    靜靜的時光屋閱讀 780評論 6 0
  • 凌晨5點爆袍,夢醒來首繁,想把自己最真實的感受記錄下來。一直覺得自己過得特別不容易陨囊,然后想想家里的爸媽弦疮,年歲已高,不知道他...
    b130487cfa0e閱讀 167評論 0 0
  • 文/新鮮 對不起蜘醋,謝謝你胁塞,我愛你,請原諒压语。 1.在對接本次的理財活動啸罢,對于策劃活動的小白來說。有瀟瀟的指點讓我有思...
    新鮮wendy閱讀 286評論 0 0
  • They say only mother is.good.in the.world A mother's chil...
    解雨欣Gloria閱讀 551評論 0 0