1. 程式人生 > >懶癌必備-dplyr和data.table讓你的資料分析事半功倍

懶癌必備-dplyr和data.table讓你的資料分析事半功倍

duang,duang!Erin又上線為大家分享乾貨來了。
最近Erin在做信用風險評級模型的開發,幾千行的程式碼敲的我頭暈眼花。作為一個懶癌晚期,並且追求高效率的資料er,怎麼能受得了浪費時間去造輪子呢。接下來,我就為大家分享幾個我在工作當中最常用來做資料分析用到的包,dplyr和data.table,我保證你get到這兩個包後,就再也不想用R裡面自帶的基礎包函式進行資料分析了!!(賊笑中)

dplyr包

R語言中最為重要的包(之一)!
它可以讓資料分析功能更加強大,程式碼更加簡潔。你可以隨心所欲的操作它,使用它獲取你想要的資料,而且它的語法非常簡單,非常直白。在程式語言裡面,說語法簡單,意味著程式語言與我們正常人的邏輯思維是一致的。它相對於R自帶的篩選方法會更高效,我們不需要花很多時間去等待機器反應。
我工作當中,或者是公認的最常用的方法,無非就是下面幾種:
① 資料過濾
② 資料選擇
③ 資料排序
④ 資料轉換
⑤ 資料分組
⑥ 資料抽樣

大家做資料分析,會發現90%的時間都在與這幾個打交道。dplyr很慶幸,都提供了關於常用方法的一些函式。
在GitHub上面,之前有人做了一個統計,以下幾個函式最為常用:

filter( ) 過濾

filter(df,cond1,cond2,…) 用逗號,隔開表示條件是and的關係
filter(df,cond1|cond2|…) 用豎線|隔開表示條件是or的關係
slice(df,80:100) 選取索引80到100的資料

arrange( ) 對資料框進行排序

arrange(df,V1,desc(V2),V3) 對V1,V3升序排序,對V2降序排序

※arrange的語法非常簡單,功能也很強大,我們再也不要用order()函數了

select( ) 選擇列

select(df,V1,V2,V3) 選擇V1,V2,V3列資料
select(df,V1:V3) 選擇V1到V3列的所有資料
t<-select(df,-c(V1,V3)) 選擇除了V1,V3以外的所有列

distinct( ) 去重

distinct(df,V1,V2) 根據V1和V2兩個條件來進行去重

在基礎包裡面也有一個去重函式unique()
※注意distinct()可以針對某些列進行去重,而unique()只能對整個資料框進行去重。

mutate( ) 為資料增加新列

mutate(df,vnew1=v1-v2,vnew2=vnew1+v3)

與基礎包裡的transform()函式接近,但mutate可以使用你剛剛建立的column,
transform則不行,會報錯:”找不到物件vnew”

summarise( ) 計算統計資料

summarise(df,sum(v1))

sample_n(df,1000) 隨機抽取1000條資料
sample_frac(df,0.7) 隨機抽取70%的資料

看了以上這幾個函式,是不是覺得dplyr包超簡單!對!我們要的就是簡潔簡單!有這麼好的作者給你開發了這麼好的packages,你就放心大膽的用唄,不用自己去寫基礎程式碼造輪子的事,多好!!找到合適的packages並學習使用它,絕對會讓我們資料分析工作事半功倍!

我們有沒有發現dylyr包中函式使用的一些規律?
有的!
①第一個引數都是資料集df
②查詢條件都是關於如何操作資料集的,在列上面進行操作
③返回的都是新的資料集,不會改變原始資料集

在介紹下一個包之前,我們先來引入一個dplyr包的綜合運用:

grouped<-group_by(df,v1,V2) #df被v1,v2進行分組
newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))

以上這段程式碼我們使用group_by和summarise的結合實現了對資料集分組分析,並進行統計量計算的一個功能。學習了下面的data.table包以後,你再回來看看這個,你絕對不會選擇這種寫法並且超級鄙視它!

data.table包

dplyr已經可以滿足我們資料分析工作中大部分的需求,後來該包的作者又開發了一個炫酷吊炸天的包“data.table”
如果你的日常處理資料在幾萬到十幾萬行,那麼用dplyr就完全足夠了。
如果你的日常處理資料量非常大,有上億行的資料處理需求,這個時候你完全可以放心大膽的使用data.table
這個包異常的高效,速度非常的快!!
官網上面有關於data.table包對於dplyr的提升和改進:

這裡寫圖片描述

作為課代表的我來幫大家簡單的總結一下:
我們都知道R有個令人詬病的缺點就是跑起來耗記憶體,data.table相對於dplyr
更快、更節省記憶體了!data.table這個包的語法用起來稍微有點奇怪(哈哈~),
但是速度親媽快啊!!小夥伴們一定不能錯過的絕世好包

鋪墊了這麼多,來來來,資料分析神器data.table走起來!!

還是那句話,講幾個最常用的函式,就算你的資料量大到逆天,data.table跑起來都是遊刃有餘的。剩下的大家有什麼特殊需求再去下載官方文件看就好啦!

DT<-data.table()
DT[i,j,by]
take DT,subset rows using i,then calculate j grouped by by
我們在橫軸上過濾資料,用by進行分組,然後在列上面進行計算。

使用i

DT[35] #選取3到5行的資料
class(DT)
[1] "data.table" "data.frame"
DT[v1=="A"] #基於條件的選擇
DT[v1 %in% c("A","B")]

使用j

DT[,v1] #選擇v1列

那如果我要選擇多列呢,大家注意一下這裡不是用c()來選取了,
而是通過.()來選取,注意前面有一個”.”號,所以我說data.table的語法有點奇怪呢。

DT[,.(v1,v3)]
#在j上呼叫函式
DT[,sum(v1)]
DT[,.(sum(v1),sd(v3))]

data.table居然支援直接在j上進行列的計算,看到這裡是不是覺得超牛逼,關鍵是程式碼非常簡潔,一句話的事,就幫我們完成資料的篩選和計算了!

DT[,.(sum_v1=sum(v1),sd_v3=sd(v3))]

還可以直接給計算的列賦予名稱哦!!功能強大得我都要笑開花了!

使用by

這還只是小試牛刀,你忘了我們還有個by嗎!!

DT[,.(mean_age=mean(age),sum_sale=sum(sales)),by=.(v1,v2)]

回顧一下我們在上一節最後保留的一段程式碼:

group_by()
grouped<-group_by(df,v1,V2) #data被v1,v2進行分組
newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))

以上兩段程式碼的效果是等同的!data.table把我們剛剛用group_by和summarise組合才能實現的功能,直接在一句程式碼裡面就實現了,而且程式碼的可讀性和可擴充套件運用性非常強!

以上講的這些只是我工作中data.table用得最多的功能,它的強大之處還遠遠不止這些!如果你想深入,可以去官網下載文件,你絕對值得擁有!(反正我用了data.table以後就再也不想用R裡面基礎包自帶的函數了,今天就黑到這裡,匿了~)

——Copyright Reserved by Erin