dplyr和data.table让你的数据分析事半功倍
dplyr和data.table讓你的數(shù)據(jù)分析事半功倍
原創(chuàng) 2017年08月06日 12:32:40 duang,duang!Erin又上線為大家分享干貨來了。
最近Erin在做信用風(fēng)險評級模型的開發(fā),幾千行的代碼敲的我頭暈眼花。作為一個懶癌晚期,并且追求高效率的數(shù)據(jù)er,怎么能受得了浪費時間去造輪子呢。接下來,我就為大家分享幾個我在工作當(dāng)中最常用來做數(shù)據(jù)分析用到的包,dplyr和data.table,我保證你get到這兩個包后,就再也不想用R里面自帶的基礎(chǔ)包函數(shù)進行數(shù)據(jù)分析了!!(賊笑中)
dplyr包
R語言中最為重要的包(之一)!
它可以讓數(shù)據(jù)分析功能更加強大,代碼更加簡潔。你可以隨心所欲的操作它,使用它獲取你想要的數(shù)據(jù),而且它的語法非常簡單,非常直白。在編程語言里面,說語法簡單,意味著編程語言與我們正常人的邏輯思維是一致的。它相對于R自帶的篩選方法會更高效,我們不需要花很多時間去等待機器反應(yīng)。
我工作當(dāng)中,或者是公認(rèn)的最常用的方法,無非就是下面幾種:
① 數(shù)據(jù)過濾
② 數(shù)據(jù)選擇
③ 數(shù)據(jù)排序
④ 數(shù)據(jù)轉(zhuǎn)換
⑤ 數(shù)據(jù)分組
⑥ 數(shù)據(jù)抽樣
大家做數(shù)據(jù)分析,會發(fā)現(xiàn)90%的時間都在與這幾個打交道。dplyr很慶幸,都提供了關(guān)于常用方法的一些函數(shù)。
在GitHub上面,之前有人做了一個統(tǒng)計,以下幾個函數(shù)最為常用:
filter( ) 過濾
filter(df,cond1,cond2,…) 用逗號,隔開表示條件是and的關(guān)系
filter(df,cond1|cond2|…) 用豎線|隔開表示條件是or的關(guān)系
slice(df,80:100) 選取索引80到100的數(shù)據(jù)
arrange( ) 對數(shù)據(jù)框進行排序
arrange(df,V1,desc(V2),V3) 對V1,V3升序排序,對V2降序排序
※arrange的語法非常簡單,功能也很強大,我們再也不要用order()函數(shù)了
select( ) 選擇列
select(df,V1,V2,V3) 選擇V1,V2,V3列數(shù)據(jù)
select(df,V1:V3) 選擇V1到V3列的所有數(shù)據(jù)
t<-select(df,-c(V1,V3)) 選擇除了V1,V3以外的所有列
distinct( ) 去重
distinct(df,V1,V2) 根據(jù)V1和V2兩個條件來進行去重
在基礎(chǔ)包里面也有一個去重函數(shù)unique()
※注意distinct()可以針對某些列進行去重,而unique()只能對整個數(shù)據(jù)框進行去重。
mutate( ) 為數(shù)據(jù)增加新列
mutate(df,vnew1=v1-v2,vnew2=vnew1+v3)
與基礎(chǔ)包里的transform()函數(shù)接近,但mutate可以使用你剛剛創(chuàng)建的column,
transform則不行,會報錯:”找不到對象vnew”
summarise( ) 計算統(tǒng)計數(shù)據(jù)
summarise(df,sum(v1))
sample_n(df,1000) 隨機抽取1000條數(shù)據(jù)
sample_frac(df,0.7) 隨機抽取70%的數(shù)據(jù)
看了以上這幾個函數(shù),是不是覺得dplyr包超簡單!對!我們要的就是簡潔簡單!有這么好的作者給你開發(fā)了這么好的packages,你就放心大膽的用唄,不用自己去寫基礎(chǔ)代碼造輪子的事,多好!!找到合適的packages并學(xué)習(xí)使用它,絕對會讓我們數(shù)據(jù)分析工作事半功倍!
我們有沒有發(fā)現(xiàn)dylyr包中函數(shù)使用的一些規(guī)律?
有的!
①第一個參數(shù)都是數(shù)據(jù)集df
②查詢條件都是關(guān)于如何操作數(shù)據(jù)集的,在列上面進行操作
③返回的都是新的數(shù)據(jù)集,不會改變原始數(shù)據(jù)集
在介紹下一個包之前,我們先來引入一個dplyr包的綜合運用:
grouped<-group_by(df,v1,V2) #df被v1,v2進行分組 newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))- 1
- 2
以上這段代碼我們使用group_by和summarise的結(jié)合實現(xiàn)了對數(shù)據(jù)集分組分析,并進行統(tǒng)計量計算的一個功能。學(xué)習(xí)了下面的data.table包以后,你再回來看看這個,你絕對不會選擇這種寫法并且超級鄙視它!
data.table包
dplyr已經(jīng)可以滿足我們數(shù)據(jù)分析工作中大部分的需求,后來該包的作者又開發(fā)了一個炫酷吊炸天的包“data.table”
如果你的日常處理數(shù)據(jù)在幾萬到十幾萬行,那么用dplyr就完全足夠了。
如果你的日常處理數(shù)據(jù)量非常大,有上億行的數(shù)據(jù)處理需求,這個時候你完全可以放心大膽的使用data.table
這個包異常的高效,速度非常的快!!
官網(wǎng)上面有關(guān)于data.table包對于dplyr的提升和改進:
作為課代表的我來幫大家簡單的總結(jié)一下:
我們都知道R有個令人詬病的缺點就是跑起來耗內(nèi)存,data.table相對于dplyr
更快、更節(jié)省內(nèi)存了!data.table這個包的語法用起來稍微有點奇怪(哈哈~),
但是速度親媽快啊!!小伙伴們一定不能錯過的絕世好包!
鋪墊了這么多,來來來,數(shù)據(jù)分析神器data.table走起來!!
還是那句話,講幾個最常用的函數(shù),就算你的數(shù)據(jù)量大到逆天,data.table跑起來都是游刃有余的。剩下的大家有什么特殊需求再去下載官方文檔看就好啦!
DT<-data.table()
DT[i,j,by]
take DT,subset rows using i,then calculate j grouped by by
我們在橫軸上過濾數(shù)據(jù),用by進行分組,然后在列上面進行計算。
使用i
DT[3:5] #選取3到5行的數(shù)據(jù) class(DT) [1] "data.table" "data.frame" DT[v1=="A"] #基于條件的選擇 DT[v1 %in% c("A","B")]- 1
- 2
- 3
- 4
- 5
使用j
DT[,v1] #選擇v1列- 1
那如果我要選擇多列呢,大家注意一下這里不是用c()來選取了,
而是通過.()來選取,注意前面有一個”.”號,所以我說data.table的語法有點奇怪呢。
- 1
- 1
- 2
- 3
data.table居然支持直接在j上進行列的計算,看到這里是不是覺得超牛逼,關(guān)鍵是代碼非常簡潔,一句話的事,就幫我們完成數(shù)據(jù)的篩選和計算了!
DT[,.(sum_v1=sum(v1),sd_v3=sd(v3))]- 1
還可以直接給計算的列賦予名稱哦!!功能強大得我都要笑開花了!
使用by
這還只是小試牛刀,你忘了我們還有個by嗎!!
DT[,.(mean_age=mean(age),sum_sale=sum(sales)),by=.(v1,v2)]- 1
回顧一下我們在上一節(jié)最后保留的一段代碼:
group_by() grouped<-group_by(df,v1,V2) #data被v1,v2進行分組 newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))- 1
- 2
- 3
以上兩段代碼的效果是等同的!data.table把我們剛剛用group_by和summarise組合才能實現(xiàn)的功能,直接在一句代碼里面就實現(xiàn)了,而且代碼的可讀性和可擴展運用性非常強!
以上講的這些只是我工作中data.table用得最多的功能,它的強大之處還遠(yuǎn)遠(yuǎn)不止這些!如果你想深入,可以去官網(wǎng)下載文檔,你絕對值得擁有!(反正我用了data.table以后就再也不想用R里面基礎(chǔ)包自帶的函數(shù)了,今天就黑到這里,匿了~)
總結(jié)
以上是生活随笔為你收集整理的dplyr和data.table让你的数据分析事半功倍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不会做特征工程的 AI 研究员不是好数据
- 下一篇: FinTech-Blockchain区块