《R語言資料分析》 3 2 聚集

2021-09-23 16:50:01 字數 3672 閱讀 6821

3.2 聚集

最直接的資料彙總方法應該是呼叫stats包的aggregate函式,該函式能支援以下我們期望的功能:通過分組變數將資料劃分成不同的子集,並分別對這些子集進行統計彙總。呼叫aggregate函式的最基本方法之一是傳遞待聚集的數值向量,以及乙個因子變數,該因子變數將定義引數fun的值,以確定劃分函式。下面的樣例中,我們以每個工作日航班平均轉飛率作為劃分依據:

當然,我們需要一定時間來執行上述分析,不過別忘了我們剛剛處理的是將近25萬行資料,以分析2023年從休斯頓機場出發的航班日均轉非率。

換句話說,這個結果對那些沒有納入日均轉飛率統計的資料一樣有意義,例如,從結果可知,一周中周

三、周四這兩天的航班轉飛率(0.3%左右)比週末的航班轉飛率(0.25%左右)更高一些,至少從休斯頓機場出發的航班是這種情況。

另外一種類似呼叫上述函式的方法是使用with函式,使用with函式的語法看起來更容易理解一些,因為在with函式裡,我們不用重複地引用hflights資料庫:

執行結果因和上一種方法完全一致就不再重複顯示了。從aggregate函式的指南(參見?aggregate)可知其返回結果比較容易理解。不過,如果要從結果中檢視返回資料列名並不容易?我們可以通過使用公式化的標記而不是像之前樣例那樣採用直接定義數值和因子變數的方法來解決這個問題:

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

輸入的字元相對較少

結果中顯示的行名稱是正確的

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

公式化標記是從s語言繼承下來的,常見語法形式為:response_variable~predictor_variable_1 + … + predictor_variable_n。該標記也包括一些其他記號,例如用「-」去掉變數,用「:」或「*」來包含變數間的相互作用。參見本書第5章建模(由renata nemeth和gergely tot授權閱讀),以及在r控制台使用?formula命令獲得更多細節內容。

3.2.1 使用基礎的r命令實現快速聚集

3.2.2 方便的輔助函式

上述轉換過程可以很容易地以一種使用者容易理解的方式完成,例如,plyr包(dplyr包更常見的一種形式)就是為資料框開發的特殊plyr版本(plyr specialized for data frames)。

plyr包提供了非常多的函式來處理data.frame、list或array型別的物件,返回結果也支援以上各種資料型別。這些函式的命名規則非常容易記憶:函式名的第乙個字元代表輸入資料的類別,第二個字元代表輸出格式,所有的情況都以ply結尾。除了前面提到的三種r資料型別,還存在一些特殊的字元定義:

d代表data.frame

s代表array

l代表list

m為一種特殊的輸入型別,它意味著我們以**方式為函式提供了多個引數

r代表函式希望輸入乙個整數,以指明函式將要複製的次數

_是一種特殊的輸出型別,此時函式將不返回任何結果

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

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

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

l_ply不返回任何結果,但是在某些情況下非常有用。例如,基於一定元素遞迴而不使用for迴圈;作為.progress引數,可以獲得當前迭代狀態以及剩餘時間。

裝載包,並將mean函式作用於由dayofweek劃分的資料子集的diverted列:

plyr包的.函式為使用者提供了一種方便的引用變數(名稱)的方法。否則,ddply包將採用其他方式來解釋dayofweek列的內容,導致錯誤。

這裡要說明的重要一點是ddply比之前我們用過的aggregate函式速度更快。但從其他方面而言,我對這個結果還並不十分滿意,輸出結果使用了v1這樣的列名,讓我有些受不了。這裡我們不再進行更新data.frame的名稱這樣的再加工,而是呼叫summarise輔助函式來替代上面用的匿名函式,然後再顯式指定相應的列名:

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

3.2.3 高效能的輔助函式

hadley wickham是ggplot、reshape和其他一些r開發包的作者,自2023年起開發了plyr包的第二代也可以說是特定版本。最基本的起因在於plyr包經常被用於將一類data.frame資料轉換成另一類data.frame資料,因此對它的應用需要特別小心。dplyr包是專門針對資料框應用開發的plyr定製版,實現速度更快,開發語言為c++,dplyr包還支援遠端資料庫。

不過,函式執行效率還是根據具體情況不同而變化。例如,dplyr包的語法與plyr包相比,就有非常大的改變。儘管前面提到的summarise函式在dplyr包裡也可以使用,但dplyr包中已經沒有單獨的ddplyr函式,在dplyr包中所有的函式都是以plyr::ddplyr的元件身份執行的。

無論如何,為了不讓理論知識太過複雜,如果希望對某個資料集的子集進行彙總,我們首先要在聚集操作之前定義好分組:

結果物件和data.frame非常類似,只有一點不同:元資料將根據屬性的平均值合併到物件中。為了讓輸出結果短一點,我們不會展示物件的整個資料結構(str),只顯示其屬性:

從輸出的元資料可知,屬性indicies很重要,它包含了每週中每天記錄的id,這樣接下來的操作就能很容易地從整個資料集中選擇所需的子集。下面,讓我們看一下通過使用dplyr包的summairse函式而非plyr在提高操作效能後,轉飛航班的比率:

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

3.2.4 使用data.table完成聚集

讀者們還記得[.data.table的第二個引數嗎?我們稱之為j,該引數包含了乙個select或update功能的sql語句,其最重要的特性就是支援r表示式。因此,我們可以不使用函式,而是借助by引數來實現分組。

如果不希望採用v1來為結果**的第二列資料命名,可以將summary物件指定為乙個命名list,例如,hf?lights_dt[, list('mean(diverted)'= mean(diverted)), by = dayofweek],我們可以使用符號「.」而非list,就像在plyr包中的方法一樣。

除了將結果按期望順序排序,在現有鍵值列上進行資料統計速度也相對較快,下面我們將用一些實際案例對此進行說明。

R語言 資料分析

二 大資料分析 三 資料分析常用工具 資料分析是指用適當的統計方法對收集來的大量第一手資料和第二手資料進行分析,以求最大化地開發資料資料的功能,發揮資料的作用。資料分析是為了驗證假設的問題,需要提供必要的資料驗證。分析模型構建完成後,需要利用測試資料驗證模型的正確性。資料分析是為了挖掘更多的問題,並...

R語言 基本資料分析

本文基於r語言進行基本資料統計分析,包括基本作圖,線性擬合,邏輯回歸,bootstrap取樣和anova方差分析的實現及應用。不多說,直接上 中有注釋。1.基本作圖 盒圖,qq圖 basic plot boxplot x qqplot x,y 2.線性擬合 linear regression n 1...

R語言 TCGA資料分析一

我最近在做tcga資料分析,在處理中遇到的問題及其收穫。主要包括 涉及到的函式有 小寫 大寫 單一的區域性匹配 多個全域性匹配 保留固定長度的字元在ranseqgene中case id 為大寫的,而clincial中為小寫的。需要對case id 做轉換。方案一 大寫變小寫tolower colna...