R语言数据转换——plyr包
- plyr包簡介
plyr包是Hadley Wickham為解決split – apply – combine問題而寫的一個包,其動機在與提供超越for循環和內置的apply函數族的一個一攬子解決方案。使用plyr包可以針對不同的數據類型,在一個函數內同時完成split – apply – combine三個步驟,以實現最大限度的高效和簡潔。
plyr包特別適合處理大型數據集問題,比如對空間數據的空間位置或時間序列面板數據的時間點建模,或者在高維數組中進行數據探索等等。
此包作者Hadley Wickham可以說是R社區的一位大神級的人物。他先后寫出了17個R包,包括目前統計圖形方面的大熱門ggplot2。作者自述其研究興趣在于發展使數據分析變簡單的工具特別是超越傳統統計的數據清理,組織和探索方法。
為說明plyr包的特點和優勢所在,下面看兩個例子:
(1)對于簡單的問題,plyr和apply函數的效果差不多
> m<-matrix(c(1:4,1,4,1:6),ncol=3)
> apply(m,1,mean)
[1] 1.666667 3.333333 3.000000 4.000000
> aaply(m,1,mean)
???????1 2 3 4
1.666667 3.333333 3.000000 4.000000
(2)下面來個復雜點的
取鳶尾花iris數據集,對每一種花,建立一個線性回歸模型,并給出結果。
> attach(iris)
> head(iris)
?Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
建立回歸方程,
model <- function(x){ lm(Speal.Length~Speal.Width, data=x)}
使用apply函數族,需要分割,計算和合并(最少需要三個語句):
> pieces <- split(iris,list(iris$Species))
> models <- lapply(pieces,model)
#這兩句也可替代為models<- by(iris[, 1:4], Species, model)
> result <- lapply(models,coef)
> do.call('rbind',result)
用pylr包只需要兩句:
> result1 <- dlply(iris,.(Species),model)
> result2 <- ldply(result1,function(x) coef(x))
至于for語句,就不用寫了吧,地方不夠。
- pylr包的使用
(1)命名規則
pylr的基本函數集如下(根據1.7.1版):
?
命名規則:前三行是基本類型。
根據輸入類型和輸出類型:a=array,d=data frame,l=list,_表示輸出放棄。第一個字母表示輸入,第2個字母表示輸出。
后兩行是對應apply族的replicates和mapply這兩個函數,分別表示n次重復和多元函數參數的情況,第2個字母還是表示輸出類型。
從命名特點來看,我們不需要列出每個函數的情況了,只要從輸入和輸出兩方面分別討論即可。 (2)參數說明
這些函數有兩到三個主要的參數,依賴于輸入的類型:
. a*ply( .data, .margins, .fun, ..., .progress = "none")
. d*ply( .data, .variables, .fun, ..., .progress = "none")
. l*ply( .data, .fun, ..., .progress = "none")
參數.data是我們要用來分片-計算-合并的;參數.margins或者.variables描述了分片的方式;
參數.fun表示用來處理的函數,其它更多的參數是傳遞給處理函數的;參數.progress用來控制顯示一個進度條。
(3)輸入
輸入類型有三種,每一種類型給出了如何進行分片的不同方法。
簡單來說:
a*ply( ):數組(包括矩陣和向量)按維數分為低維的片。
d*ply( ):數據框被變量組合分成子集。
l*ply( ):列表的每個元素就是一個分片。
因此,對輸入數據集的分片,不是取決于數據的結構,而是取決于所采用的方法。
一個對象采用a*ply( )分片必須對應dim( )且接受多維的索引;采用d*ply( )分片,要利用split( )并強制轉換為列表;采用l*ply( ),需要用length() and [。
所以數據框可以被傳遞給a*ply( ),可以象2維的矩陣那樣處理,也可以傳遞給l*ply( ),被視為一個向量的列表。
三種類型各自的特點:
(a): 輸入數組(a*ply( ))
a*ply( )的分片特點在于.margins參數,它和apply很相似。
對于2維數組,.margins可以取1,2,或者c(1:2),對應2維數組的3種分片方式。
如圖,
對于3維數組,則有7種分片方式:
.margins對應更高維的情況,可能會面臨一種爆發式的組合。
(b)輸入數據框(d*ply( ))
使用d*ply時,需要特別指定分組所用的變量或變量函數,它們會被首先計算,然后才是整個數據框。
有下面幾種指定方式:
? .(var1)。按照變量var1的值來對數據框分組
?多重變量 .(a,b,c)。將按照三個變量的交互值來分組。
這種形式輸出的時候,有點復雜。如果輸出為數組,則數組會有三個維度,分別以a,b,c的值作為維數名。如果輸出為數據框,將會包含a,b,c取值的三個額外的列。如果輸出為列表,則列表元素名為按周期分割的a,b,c的值。
?作為列名的字符向量:c("var1", "var2")。
?公式~ var1 + var2。
(c)輸入列表(l*ply( ))
l*ply( )不需要描述如何分片的函數,因為列表本身就是按照元素的分劃。使用l*ply( )相當于a*ply( )作用于一維數組的效果。
?
原文:http://site.douban.com/182577/widget/notes/10567181/note/246634257/
??????????及其他幾篇綜合
總結
以上是生活随笔為你收集整理的R语言数据转换——plyr包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排名前20的网页爬虫工具有哪些_在线爬虫
- 下一篇: 从屏幕刷新频率到Unity VSync