R语言数据转换——plyr包
- plyr包簡介
plyr包是Hadley Wickham為解決split – apply – combine問題而寫的一個包,其動機在與提供超越for循環(huán)和內(nèi)置的apply函數(shù)族的一個一攬子解決方案。使用plyr包可以針對不同的數(shù)據(jù)類型,在一個函數(shù)內(nèi)同時完成split – apply – combine三個步驟,以實現(xiàn)最大限度的高效和簡潔。
plyr包特別適合處理大型數(shù)據(jù)集問題,比如對空間數(shù)據(jù)的空間位置或時間序列面板數(shù)據(jù)的時間點建模,或者在高維數(shù)組中進行數(shù)據(jù)探索等等。
此包作者Hadley Wickham可以說是R社區(qū)的一位大神級的人物。他先后寫出了17個R包,包括目前統(tǒng)計圖形方面的大熱門ggplot2。作者自述其研究興趣在于發(fā)展使數(shù)據(jù)分析變簡單的工具特別是超越傳統(tǒng)統(tǒng)計的數(shù)據(jù)清理,組織和探索方法。
為說明plyr包的特點和優(yōu)勢所在,下面看兩個例子:
(1)對于簡單的問題,plyr和apply函數(shù)的效果差不多
> 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)下面來個復(fù)雜點的
取鳶尾花iris數(shù)據(jù)集,對每一種花,建立一個線性回歸模型,并給出結(jié)果。
> 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函數(shù)族,需要分割,計算和合并(最少需要三個語句):
> 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)命名規(guī)則
pylr的基本函數(shù)集如下(根據(jù)1.7.1版):
?
命名規(guī)則:前三行是基本類型。
根據(jù)輸入類型和輸出類型:a=array,d=data frame,l=list,_表示輸出放棄。第一個字母表示輸入,第2個字母表示輸出。
后兩行是對應(yīng)apply族的replicates和mapply這兩個函數(shù),分別表示n次重復(fù)和多元函數(shù)參數(shù)的情況,第2個字母還是表示輸出類型。
從命名特點來看,我們不需要列出每個函數(shù)的情況了,只要從輸入和輸出兩方面分別討論即可。 (2)參數(shù)說明
這些函數(shù)有兩到三個主要的參數(shù),依賴于輸入的類型:
. a*ply( .data, .margins, .fun, ..., .progress = "none")
. d*ply( .data, .variables, .fun, ..., .progress = "none")
. l*ply( .data, .fun, ..., .progress = "none")
參數(shù).data是我們要用來分片-計算-合并的;參數(shù).margins或者.variables描述了分片的方式;
參數(shù).fun表示用來處理的函數(shù),其它更多的參數(shù)是傳遞給處理函數(shù)的;參數(shù).progress用來控制顯示一個進度條。
(3)輸入
輸入類型有三種,每一種類型給出了如何進行分片的不同方法。
簡單來說:
a*ply( ):數(shù)組(包括矩陣和向量)按維數(shù)分為低維的片。
d*ply( ):數(shù)據(jù)框被變量組合分成子集。
l*ply( ):列表的每個元素就是一個分片。
因此,對輸入數(shù)據(jù)集的分片,不是取決于數(shù)據(jù)的結(jié)構(gòu),而是取決于所采用的方法。
一個對象采用a*ply( )分片必須對應(yīng)dim( )且接受多維的索引;采用d*ply( )分片,要利用split( )并強制轉(zhuǎn)換為列表;采用l*ply( ),需要用length() and [。
所以數(shù)據(jù)框可以被傳遞給a*ply( ),可以象2維的矩陣那樣處理,也可以傳遞給l*ply( ),被視為一個向量的列表。
三種類型各自的特點:
(a): 輸入數(shù)組(a*ply( ))
a*ply( )的分片特點在于.margins參數(shù),它和apply很相似。
對于2維數(shù)組,.margins可以取1,2,或者c(1:2),對應(yīng)2維數(shù)組的3種分片方式。
如圖,
對于3維數(shù)組,則有7種分片方式:
.margins對應(yīng)更高維的情況,可能會面臨一種爆發(fā)式的組合。
(b)輸入數(shù)據(jù)框(d*ply( ))
使用d*ply時,需要特別指定分組所用的變量或變量函數(shù),它們會被首先計算,然后才是整個數(shù)據(jù)框。
有下面幾種指定方式:
? .(var1)。按照變量var1的值來對數(shù)據(jù)框分組
?多重變量 .(a,b,c)。將按照三個變量的交互值來分組。
這種形式輸出的時候,有點復(fù)雜。如果輸出為數(shù)組,則數(shù)組會有三個維度,分別以a,b,c的值作為維數(shù)名。如果輸出為數(shù)據(jù)框,將會包含a,b,c取值的三個額外的列。如果輸出為列表,則列表元素名為按周期分割的a,b,c的值。
?作為列名的字符向量:c("var1", "var2")。
?公式~ var1 + var2。
(c)輸入列表(l*ply( ))
l*ply( )不需要描述如何分片的函數(shù),因為列表本身就是按照元素的分劃。使用l*ply( )相當(dāng)于a*ply( )作用于一維數(shù)組的效果。
?
原文:http://site.douban.com/182577/widget/notes/10567181/note/246634257/
??????????及其他幾篇綜合
總結(jié)
以上是生活随笔為你收集整理的R语言数据转换——plyr包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排名前20的网页爬虫工具有哪些_在线爬虫
- 下一篇: R语言——TTR包