日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dplyr和data.table让你的数据分析事半功倍

發(fā)布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dplyr和data.table让你的数据分析事半功倍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

dplyr和data.table讓你的數(shù)據(jù)分析事半功倍

原創(chuàng) 2017年08月06日 12:32:40
  • 710

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[35] #選取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的語法有點奇怪呢。

DT[,.(v1,v3)]
  • 1
#在j上調(diào)用函數(shù) DT[,sum(v1)] DT[,.(sum(v1),sd(v3))]
  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。