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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

《R语言数据分析》——3.2 聚集

發(fā)布時間:2024/4/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《R语言数据分析》——3.2 聚集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)書摘來自華章出版社《R語言數(shù)據(jù)分析》一書中的第3章,第3.2節(jié),作者蓋爾蓋伊·道羅齊(Gergely Daróczi),潘怡 譯,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章計算機”公眾號查看。

3.2 聚集

最直接的數(shù)據(jù)匯總方法應(yīng)該是調(diào)用stats包的aggregate函數(shù),該函數(shù)能支持以下我們期望的功能:通過分組變量將數(shù)據(jù)劃分成不同的子集,并分別對這些子集進行統(tǒng)計匯總。調(diào)用aggregate函數(shù)的最基本方法之一是傳遞待聚集的數(shù)值向量,以及一個因子變量,該因子變量將定義參數(shù)FUN的值,以確定劃分函數(shù)。下面的樣例中,我們以每個工作日航班平均轉(zhuǎn)飛率作為劃分依據(jù):

當(dāng)然,我們需要一定時間來執(zhí)行上述分析,不過別忘了我們剛剛處理的是將近25萬行數(shù)據(jù),以分析2011年從休斯頓機場出發(fā)的航班日均轉(zhuǎn)非率。

換句話說,這個結(jié)果對那些沒有納入日均轉(zhuǎn)飛率統(tǒng)計的數(shù)據(jù)一樣有意義,例如,從結(jié)果可知,一周中周三、周四這兩天的航班轉(zhuǎn)飛率(0.3%左右)比周末的航班轉(zhuǎn)飛率(0.25%左右)更高一些,至少從休斯頓機場出發(fā)的航班是這種情況。

另外一種類似調(diào)用上述函數(shù)的方法是使用with函數(shù),使用with函數(shù)的語法看起來更容易理解一些,因為在with函數(shù)里,我們不用重復(fù)地引用hflights數(shù)據(jù)庫:

執(zhí)行結(jié)果因和上一種方法完全一致就不再重復(fù)顯示了。從aggregate函數(shù)的指南(參見?aggregate)可知其返回結(jié)果比較容易理解。不過,如果要從結(jié)果中查看返回數(shù)據(jù)列名并不容易?我們可以通過使用公式化的標記而不是像之前樣例那樣采用直接定義數(shù)值和因子變量的方法來解決這個問題:

使用公式化標記的好處是兩方面的:

輸入的字符相對較少

結(jié)果中顯示的行名稱是正確的

函數(shù)執(zhí)行的結(jié)果相對之前的函數(shù)調(diào)用方法要更快一點,請參考3.3節(jié)相關(guān)內(nèi)容。

使用公式化標記的唯一不利因素就是我們必須首先掌握這種方法,盡管該方法乍看起來稍顯笨拙,但由于很多R函數(shù)和包都可以運用這種標記方式,特別是在定義模型的時候,因此毫無疑問從長遠角度出發(fā)有必要了解好掌握該方法。

公式化標記是從S語言繼承下來的,常見語法形式為:response_variable~predictor_variable_1 + … + predictor_variable_n。該標記也包括一些其他記號,例如用“-”去掉變量,用“:”或“*”來包含變量間的相互作用。參見本書第5章建模(由Renata Nemeth和Gergely Tot授權(quán)閱讀),以及在R控制臺使用?formula命令獲得更多細節(jié)內(nèi)容。

3.2.1 使用基礎(chǔ)的R命令實現(xiàn)快速聚集

還可以通過調(diào)用函數(shù)tapply或函數(shù)by來實現(xiàn)數(shù)據(jù)聚集,這些方法可以在一個不規(guī)則的矩陣上應(yīng)用R函數(shù)。這也意味著我們能夠提供一個或多個INDEX變量,這些變量能被強制轉(zhuǎn)換為因子,然后,將相關(guān)R函數(shù)分別應(yīng)用于每個數(shù)據(jù)子集的所有單元上。下面是一個簡單的樣例說明:

請注意函數(shù)tapply返回的是一個array對象,而不是常見的數(shù)據(jù)框?qū)ο蟆Q句話說,也即該函數(shù)的執(zhí)行速度比前面介紹過得的函數(shù)都要快。因此,首先使用tapply函數(shù)完成計算過程,再將結(jié)果增加合適的列名轉(zhuǎn)換為data.frame對象是可行的。

3.2.2 方便的輔助函數(shù)

上述轉(zhuǎn)換過程可以很容易地以一種用戶容易理解的方式完成,例如,plyr包(dplyr包更常見的一種形式)就是為數(shù)據(jù)框開發(fā)的特殊plyr版本(plyr specialized for data frames)。

plyr包提供了非常多的函數(shù)來處理data.frame、list或array類型的對象,返回結(jié)果也支持以上各種數(shù)據(jù)類型。這些函數(shù)的命名規(guī)則非常容易記憶:函數(shù)名的第一個字符代表輸入數(shù)據(jù)的類別,第二個字符代表輸出格式,所有的情況都以ply結(jié)尾。除了前面提到的三種R數(shù)據(jù)類型,還存在一些特殊的字符定義:

d代表data.frame

s代表array

l代表list

m為一種特殊的輸入類型,它意味著我們以表格方式為函數(shù)提供了多個參數(shù)

r代表函數(shù)希望輸入一個整數(shù),以指明函數(shù)將要復(fù)制的次數(shù)

_是一種特殊的輸出類型,此時函數(shù)將不返回任何結(jié)果

以下最常見的組合分別代表著:

ddply以data.frame為輸入,返回也為data.frame

ldply以list為輸入,返回data.frame

l_ply不返回任何結(jié)果,但是在某些情況下非常有用。例如,基于一定元素遞歸而不使用for循環(huán);作為.progress參數(shù),可以獲得當(dāng)前迭代狀態(tài)以及剩余時間。

可以在本書第4章找到更多關(guān)于plyr包的樣例以及用戶案例。本章,我們僅關(guān)注用該包完成數(shù)據(jù)統(tǒng)計。接下來,我們將在所有樣例中使用ddply(不要與dplyr包混淆)包:采用data.frame框架作為輸入?yún)?shù),返回數(shù)據(jù)也是data.frame類型。

裝載包,并將mean函數(shù)作用于由DayofWeek劃分的數(shù)據(jù)子集的Diverted列:


plyr包的.函數(shù)為用戶提供了一種方便的引用變量(名稱)的方法。否則,ddply包將采用其他方式來解釋DayofWeek列的內(nèi)容,導(dǎo)致錯誤。

這里要說明的重要一點是ddply比之前我們用過的aggregate函數(shù)速度更快。但從其他方面而言,我對這個結(jié)果還并不十分滿意,輸出結(jié)果使用了V1這樣的列名,讓我有些受不了。這里我們不再進行更新data.frame的名稱這樣的再加工,而是調(diào)用summarise輔助函數(shù)來替代上面用的匿名函數(shù),然后再顯式指定相應(yīng)的列名:

好了,看起來像樣多了,不過我們還能做得更好嗎?

3.2.3 高性能的輔助函數(shù)

Hadley Wickham是ggplot、reshape和其他一些R開發(fā)包的作者,自2008年起開發(fā)了plyr包的第二代也可以說是特定版本。最基本的起因在于plyr包經(jīng)常被用于將一類data.frame數(shù)據(jù)轉(zhuǎn)換成另一類data.frame數(shù)據(jù),因此對它的應(yīng)用需要特別小心。dplyr包是專門針對數(shù)據(jù)框應(yīng)用開發(fā)的plyr定制版,實現(xiàn)速度更快,開發(fā)語言為C++,dplyr包還支持遠程數(shù)據(jù)庫。

不過,函數(shù)執(zhí)行效率還是根據(jù)具體情況不同而變化。例如,dplyr包的語法與plyr包相比,就有非常大的改變。盡管前面提到的summarise函數(shù)在dplyr包里也可以使用,但dplyr包中已經(jīng)沒有單獨的ddplyr函數(shù),在dplyr包中所有的函數(shù)都是以plyr::ddplyr的組件身份執(zhí)行的。

無論如何,為了不讓理論知識太過復(fù)雜,如果希望對某個數(shù)據(jù)集的子集進行匯總,我們首先要在聚集操作之前定義好分組:

結(jié)果對象和data.frame非常類似,只有一點不同:元數(shù)據(jù)將根據(jù)屬性的平均值合并到對象中。為了讓輸出結(jié)果短一點,我們不會展示對象的整個數(shù)據(jù)結(jié)構(gòu)(str),只顯示其屬性:

從輸出的元數(shù)據(jù)可知,屬性indicies很重要,它包含了每周中每天記錄的ID,這樣接下來的操作就能很容易地從整個數(shù)據(jù)集中選擇所需的子集。下面,讓我們看一下通過使用dplyr包的summairse函數(shù)而非plyr在提高操作性能后,轉(zhuǎn)飛航班的比率:

結(jié)果差不多,哪個更好呢?讀者們有沒有比較兩種方法執(zhí)行時間的差別?鑒于這些細微的差別,我們知道dplyr包效率更好。

3.2.4 使用data.table完成聚集

讀者們還記得[.data.table的第二個參數(shù)嗎?我們稱之為j,該參數(shù)包含了一個SELECT或UPDATE功能的SQL語句,其最重要的特性就是支持R表達式。因此,我們可以不使用函數(shù),而是借助by參數(shù)來實現(xiàn)分組。

如果不希望采用V1來為結(jié)果表格的第二列數(shù)據(jù)命名,可以將summary對象指定為一個命名list,例如,hf?lights_dt[, list('mean(Diverted)'= mean(Diverted)), by = DayOfWeek],我們可以使用符號“.”而非list,就像在plyr包中的方法一樣。

除了將結(jié)果按期望順序排序,在現(xiàn)有鍵值列上進行數(shù)據(jù)統(tǒng)計速度也相對較快,下面我們將用一些實際案例對此進行說明。

總結(jié)

以上是生活随笔為你收集整理的《R语言数据分析》——3.2 聚集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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