中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
掌握R語言中的apply函數(shù)族 | 粉絲日志

掌握R語言中的apply函數(shù)族

R的極客理想系列文章,涵蓋了R的思想,使用,工具,創(chuàng)新等的一系列要點,以我個人的學(xué)習(xí)和體驗去詮釋R的強(qiáng)大。

R語言作為統(tǒng)計學(xué)一門語言,一直在小眾領(lǐng)域閃耀著光芒。直到大數(shù)據(jù)的爆發(fā),R語言變成了一門炙手可熱的數(shù)據(jù)分析的利器。隨著越來越多的工程背景的人的加入,R語言的社區(qū)在迅速擴(kuò)大成長?,F(xiàn)在已不僅僅是統(tǒng)計領(lǐng)域,教育,銀行,電商,互聯(lián)網(wǎng)….都在使用R語言。

要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數(shù)學(xué),概率,統(tǒng)計知識,同時還要有創(chuàng)新精神,把R語言發(fā)揮到各個領(lǐng)域。讓我們一起動起來吧,開始R的極客理想。

關(guān)于作者:

  • 張丹(Conan), 程序員Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

轉(zhuǎn)載請注明出處:
http://blog.fens.me/r-apply/

前言

剛開始接觸R語言時,會聽到各種的R語言使用技巧,其中最重要的一條就是不要用循環(huán),效率特別低,要用向量計算代替循環(huán)計算。

那么,這是為什么呢?原因在于R的循環(huán)操作for和while,都是基于R語言本身來實現(xiàn)的,而向量操作是基于底層的C語言函數(shù)實現(xiàn)的,從性能上來看,就會有比較明顯的差距了。那么如何使用C的函數(shù)來實現(xiàn)向量計算呢,就是要用到apply的家族函數(shù),包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。

目錄

  1. apply的家族函數(shù)
  2. apply函數(shù)
  3. lapply函數(shù)
  4. sapply函數(shù)
  5. vapply函數(shù)
  6. mapply函數(shù)
  7. tapply函數(shù)
  8. rapply函數(shù)
  9. eapply函數(shù)

1. apply的家族函數(shù)

apply函數(shù)族是R語言中數(shù)據(jù)處理的一組核心函數(shù),通過使用apply函數(shù),我們可以實現(xiàn)對數(shù)據(jù)的循環(huán)、分組、過濾、類型控制等操作。但是,由于在R語言中apply函數(shù)與其他語言循環(huán)體的處理思路是完全不一樣的,所以apply函數(shù)族一直是使用者玩不轉(zhuǎn)一類核心函數(shù)。

很多R語言新手,寫了很多的for循環(huán)代碼,也不愿意多花點時間把apply函數(shù)的使用方法了解清楚,最后把R代碼寫的跟C似得,我嚴(yán)重鄙視只會寫for的R程序員。

apply函數(shù)本身就是解決數(shù)據(jù)循環(huán)處理的問題,為了面向不同的數(shù)據(jù)類型,不同的返回值,apply函數(shù)組成了一個函數(shù)族,包括了8個功能類似的函數(shù)。這其中有些函數(shù)很相似,有些也不是太一樣的。

我一般最常用的函數(shù)為apply和sapply,下面將分別介紹這8個函數(shù)的定義和使用方法。

2. apply函數(shù)

apply函數(shù)是最常用的代替for循環(huán)的函數(shù)。apply函數(shù)可以對矩陣、數(shù)據(jù)框、數(shù)組(二維、多維),按行或列進(jìn)行循環(huán)計算,對子元素進(jìn)行迭代,并把子元素以參數(shù)傳遞的形式給自定義的FUN函數(shù)中,并以返回計算結(jié)果。

函數(shù)定義:

apply(X, MARGIN, FUN, ...)

參數(shù)列表:

  • X:數(shù)組、矩陣、數(shù)據(jù)框
  • MARGIN: 按行計算或按按列計算,1表示按行,2表示按列
  • FUN: 自定義的調(diào)用函數(shù)
  • …: 更多參數(shù),可選

比如,對一個矩陣的每一行求和,下面就要用到apply做循環(huán)了。

> x<-matrix(1:12,ncol=3)> apply(x,1,sum)[1] 15 18 21 24

下面計算一個稍微復(fù)雜點的例子,按行循環(huán),讓數(shù)據(jù)框的x1列加1,并計算出x1,x2列的均值。

# 生成data.frame> x <- cbind(x1 = 3, x2 = c(4:1, 2:5)); x     x1 x2[1,]  3  4[2,]  3  3[3,]  3  2[4,]  3  1[5,]  3  2[6,]  3  3[7,]  3  4[8,]  3  5# 自定義函數(shù)myFUN,第一個參數(shù)x為數(shù)據(jù)# 第二、三個參數(shù)為自定義參數(shù),可以通過apply的'...'進(jìn)行傳入。> myFUN<- function(x, c1, c2) {+   c(sum(x[c1],1), mean(x[c2])) + }# 把數(shù)據(jù)框按行做循環(huán),每行分別傳遞給myFUN函數(shù),設(shè)置c1,c2對應(yīng)myFUN的第二、三個參數(shù)> apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8][1,]  4.0    4  4.0    4  4.0    4  4.0    4[2,]  3.5    3  2.5    2  2.5    3  3.5    4

通過這個上面的自定義函數(shù)myFUN就實現(xiàn)了,一個常用的循環(huán)計算。

如果直接用for循環(huán)來實現(xiàn),那么代碼如下:

# 定義一個結(jié)果的數(shù)據(jù)框> df<-data.frame()# 定義for循環(huán)> for(i in 1:nrow(x)){+   row<-x[i,]                                         # 每行的值+   df<-rbind(df,rbind(c(sum(row[1],1), mean(row))))   # 計算,并賦值到結(jié)果數(shù)據(jù)框+ }# 打印結(jié)果數(shù)據(jù)框> df  V1  V21  4 3.52  4 3.03  4 2.54  4 2.05  4 2.56  4 3.07  4 3.58  4 4.0

通過for循環(huán)的方式,也可以很容易的實現(xiàn)上面計算過程,但是這里還有一些額外的操作需要自己處理,比如構(gòu)建循環(huán)體、定義結(jié)果數(shù)據(jù)集、并合每次循環(huán)的結(jié)果到結(jié)果數(shù)據(jù)集。

對于上面的需求,還有第三種實現(xiàn)方法,那就是完成利用了R的特性,通過向量化計算來完成的。

> data.frame(x1=x[,1]+1,x2=rowMeans(x))  x1  x21  4 3.52  4 3.03  4 2.54  4 2.05  4 2.56  4 3.07  4 3.58  4 4.0

那么,一行就可以完成整個計算過程了。

接下來,我們需要再比較一下3種操作上面性能上的消耗。

# 清空環(huán)境變量> rm(list=ls())# 封裝fun1> fun1<-function(x){+   myFUN<- function(x, c1, c2) {+     c(sum(x[c1],1), mean(x[c2])) +   }+   apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))+ }# 封裝fun2> fun2<-function(x){+   df<-data.frame()+   for(i in 1:nrow(x)){+     row<-x[i,]+     df<-rbind(df,rbind(c(sum(row[1],1), mean(row))))+   }+ }# 封裝fun3> fun3<-function(x){+   data.frame(x1=x[,1]+1,x2=rowMeans(x))+ }# 生成數(shù)據(jù)集> x <- cbind(x1=3, x2 = c(400:1, 2:500))# 分別統(tǒng)計3種方法的CPU耗時。> system.time(fun1(x))用戶 系統(tǒng) 流逝 0.01 0.00 0.02 > system.time(fun2(x))用戶 系統(tǒng) 流逝 0.19 0.00 0.18 > system.time(fun3(x))用戶 系統(tǒng) 流逝    0    0    0 

從CPU的耗時來看,用for循環(huán)實現(xiàn)的計算是耗時最長的,apply實現(xiàn)的循環(huán)耗時很短,而直接使用R語言內(nèi)置的向量計算的操作幾乎不耗時。通過上面的測試,對同一個計算來說,優(yōu)先考慮R語言內(nèi)置的向量計算,必須要用到循環(huán)時則使用apply函數(shù),應(yīng)該盡量避免顯示的使用for,while等操作方法。

3. lapply函數(shù)

lapply函數(shù)是一個最基礎(chǔ)循環(huán)操作函數(shù)之一,用來對list、data.frame數(shù)據(jù)集進(jìn)行循環(huán),并返回和X長度同樣的list結(jié)構(gòu)作為結(jié)果集,通過lapply的開頭的第一個字母’l’就可以判斷返回結(jié)果集的類型。

函數(shù)定義:

lapply(X, FUN, ...)

參數(shù)列表:

  • X:list、data.frame數(shù)據(jù)
  • FUN: 自定義的調(diào)用函數(shù)
  • …: 更多參數(shù),可選

比如,計算list中的每個KEY對應(yīng)該的數(shù)據(jù)的分位數(shù)。

# 構(gòu)建一個list數(shù)據(jù)集x,分別包括a,b,c 三個KEY值。> x <- list(a = 1:10, b = rnorm(6,10,5), c = c(TRUE,FALSE,FALSE,TRUE));x$a [1]  1  2  3  4  5  6  7  8  9 10$b[1]  0.7585424 14.3662366 13.3772979 11.6658990  9.7011387 21.5321427$c[1]  TRUE FALSE FALSE  TRUE# 分別計算每個KEY對應(yīng)該的數(shù)據(jù)的分位數(shù)。> lapply(x,fivenum)$a[1]  1.0  3.0  5.5  8.0 10.0$b[1]  0.7585424  9.7011387 12.5215985 14.3662366 21.5321427$c[1] 0.0 0.0 0.5 1.0 1.0

lapply就可以很方便地把list數(shù)據(jù)集進(jìn)行循環(huán)操作了,還可以用data.frame數(shù)據(jù)集按列進(jìn)行循環(huán),但如果傳入的數(shù)據(jù)集是一個向量或矩陣對象,那么直接使用lapply就不能達(dá)到想要的效果了。

比如,對矩陣的列求和。

# 生成一個矩陣> x <- cbind(x1=3, x2=c(2:1,4:5))> x; class(x)     x1 x2[1,]  3  2[2,]  3  1[3,]  3  4[4,]  3  5[1] "matrix"# 求和> lapply(x, sum)[[1]][1] 3[[2]][1] 3[[3]][1] 3[[4]][1] 3[[5]][1] 2[[6]][1] 1[[7]][1] 4[[8]][1] 5

lapply會分別循環(huán)矩陣中的每個值,而不是按行或按列進(jìn)行分組計算。

如果對數(shù)據(jù)框的列求和。

> lapply(data.frame(x), sum)$x1[1] 12$x2[1] 12

lapply會自動把數(shù)據(jù)框按列進(jìn)行分組,再進(jìn)行計算。

4. sapply函數(shù)

sapply函數(shù)是一個簡化版的lapply,sapply增加了2個參數(shù)simplify和USE.NAMES,主要就是讓輸出看起來更友好,返回值為向量,而不是list對象。

函數(shù)定義:

sapply(X, FUN, ..., simplify=TRUE, USE.NAMES = TRUE)

參數(shù)列表:

  • X:數(shù)組、矩陣、數(shù)據(jù)框
  • FUN: 自定義的調(diào)用函數(shù)
  • …: 更多參數(shù),可選
  • simplify: 是否數(shù)組化,當(dāng)值array時,輸出結(jié)果按數(shù)組進(jìn)行分組
  • USE.NAMES: 如果X為字符串,TRUE設(shè)置字符串為數(shù)據(jù)名,F(xiàn)ALSE不設(shè)置

我們還用上面lapply的計算需求進(jìn)行說明。

> x <- cbind(x1=3, x2=c(2:1,4:5))# 對矩陣計算,計算過程同lapply函數(shù)> sapply(x, sum)[1] 3 3 3 3 2 1 4 5# 對數(shù)據(jù)框計算> sapply(data.frame(x), sum)x1 x2 12 12 # 檢查結(jié)果類型,sapply返回類型為向量,而lapply的返回類型為list> class(lapply(x, sum))[1] "list"> class(sapply(x, sum))[1] "numeric"

如果simplify=FALSE和USE.NAMES=FALSE,那么完全sapply函數(shù)就等于lapply函數(shù)了。

> lapply(data.frame(x), sum)$x1[1] 12$x2[1] 12> sapply(data.frame(x), sum, simplify=FALSE, USE.NAMES=FALSE)$x1[1] 12$x2[1] 12

對于simplify為array時,我們可以參考下面的例子,構(gòu)建一個三維數(shù)組,其中二個維度為方陣。

> a<-1:2# 按數(shù)組分組> sapply(a,function(x) matrix(x,2,2), simplify='array'), , 1     [,1] [,2][1,]    1    1[2,]    1    1, , 2     [,1] [,2][1,]    2    2[2,]    2    2# 默認(rèn)情況,則自動合并分組> sapply(a,function(x) matrix(x,2,2))     [,1] [,2][1,]    1    2[2,]    1    2[3,]    1    2[4,]    1    2

對于字符串的向量,還可以自動生成數(shù)據(jù)名。

> val<-head(letters)# 默認(rèn)設(shè)置數(shù)據(jù)名> sapply(val,paste,USE.NAMES=TRUE)  a   b   c   d   e   f "a" "b" "c" "d" "e" "f" # USE.NAMES=FALSE,則不設(shè)置數(shù)據(jù)名> sapply(val,paste,USE.NAMES=FALSE)[1] "a" "b" "c" "d" "e" "f"

5. vapply函數(shù)

vapply類似于sapply,提供了FUN.VALUE參數(shù),用來控制返回值的行名,這樣可以讓程序更健壯。

函數(shù)定義:

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

參數(shù)列表:

  • X:數(shù)組、矩陣、數(shù)據(jù)框
  • FUN: 自定義的調(diào)用函數(shù)
  • FUN.VALUE: 定義返回值的行名row.names
  • …: 更多參數(shù),可選
  • USE.NAMES: 如果X為字符串,TRUE設(shè)置字符串為數(shù)據(jù)名,F(xiàn)ALSE不設(shè)置

比如,對數(shù)據(jù)框的數(shù)據(jù)進(jìn)行累計求和,并對每一行設(shè)置行名row.names

# 生成數(shù)據(jù)集> x <- data.frame(cbind(x1=3, x2=c(2:1,4:5)))# 設(shè)置行名,4行分別為a,b,c,d> vapply(x,cumsum,FUN.VALUE=c('a'=0,'b'=0,'c'=0,'d'=0))  x1 x2a  3  2b  6  3c  9  7d 12 12# 當(dāng)不設(shè)置時,為默認(rèn)的索引值> a<-sapply(x,cumsum);a     x1 x2[1,]  3  2[2,]  6  3[3,]  9  7[4,] 12 12# 手動的方式設(shè)置行名> row.names(a)<-c('a','b','c','d')> a  x1 x2a  3  2b  6  3c  9  7d 12 12

通過使用vapply可以直接設(shè)置返回值的行名,這樣子做其實可以節(jié)省一行的代碼,讓代碼看起來更順暢,當(dāng)然如果不愿意多記一個函數(shù),那么也可以直接忽略它,只用sapply就夠了。

6. mapply函數(shù)

mapply也是sapply的變形函數(shù),類似多變量的sapply,但是參數(shù)定義有些變化。第一參數(shù)為自定義的FUN函數(shù),第二個參數(shù)’…’可以接收多個數(shù)據(jù),作為FUN函數(shù)的參數(shù)調(diào)用。

函數(shù)定義:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)

參數(shù)列表:

  • FUN: 自定義的調(diào)用函數(shù)
  • …: 接收多個數(shù)據(jù)
  • MoreArgs: 參數(shù)列表
  • SIMPLIFY: 是否數(shù)組化,當(dāng)值array時,輸出結(jié)果按數(shù)組進(jìn)行分組
  • USE.NAMES: 如果X為字符串,TRUE設(shè)置字符串為數(shù)據(jù)名,F(xiàn)ALSE不設(shè)置

比如,比較3個向量大小,按索引順序取較大的值。

> set.seed(1)# 定義3個向量> x<-1:10> y<-5:-4> z<-round(runif(10,-5,5))# 按索引順序取較大的值。> mapply(max,x,y,z) [1]  5  4  3  4  5  6  7  8  9 10

再看一個例子,生成4個符合正態(tài)分布的數(shù)據(jù)集,分別對應(yīng)的均值和方差為c(1,10,100,1000)。

> set.seed(1)# 長度為4> n<-rep(4,4)# m為均值,v為方差> m<-v<-c(1,10,100,1000)# 生成4組數(shù)據(jù),按列分組> mapply(rnorm,n,m,v)          [,1]      [,2]      [,3]       [,4][1,] 0.3735462 13.295078 157.57814   378.7594[2,] 1.1836433  1.795316  69.46116 -1214.6999[3,] 0.1643714 14.874291 251.17812  2124.9309[4,] 2.5952808 17.383247 138.98432   955.0664

由于mapply是可以接收多個參數(shù)的,所以我們在做數(shù)據(jù)操作的時候,就不需要把數(shù)據(jù)先合并為data.frame了,直接一次操作就能計算出結(jié)果了。

7. tapply函數(shù)

tapply用于分組的循環(huán)計算,通過INDEX參數(shù)可以把數(shù)據(jù)集X進(jìn)行分組,相當(dāng)于group by的操作。

函數(shù)定義:

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

參數(shù)列表:

  • X: 向量
  • INDEX: 用于分組的索引
  • FUN: 自定義的調(diào)用函數(shù)
  • …: 接收多個數(shù)據(jù)
  • simplify : 是否數(shù)組化,當(dāng)值array時,輸出結(jié)果按數(shù)組進(jìn)行分組

比如,計算不同品種的鳶尾花的花瓣(iris)長度的均值。

# 通過iris$Species品種進(jìn)行分組> tapply(iris$Petal.Length,iris$Species,mean)    setosa versicolor  virginica      1.462      4.260      5.552 

對向量x和y進(jìn)行計算,并以向量t為索引進(jìn)行分組,求和。

> set.seed(1)# 定義x,y向量> x<-y<-1:10;x;y [1]  1  2  3  4  5  6  7  8  9 10 [1]  1  2  3  4  5  6  7  8  9 10# 設(shè)置分組索引t> t<-round(runif(10,1,100)%%2);t [1] 1 2 2 1 1 2 1 0 1 1# 對x進(jìn)行分組求和> tapply(x,t,sum) 0  1  2  8 36 11 

由于tapply只接收一個向量參考,通過’…’可以把再傳給你FUN其他的參數(shù),那么我們想去y向量也進(jìn)行求和,把y作為tapply的第4個參數(shù)進(jìn)行計算。

> tapply(x,t,sum,y) 0  1  2 63 91 66 

得到的結(jié)果并不符合我們的預(yù)期,結(jié)果不是把x和y對應(yīng)的t分組后求和,而是得到了其他的結(jié)果。第4個參數(shù)y傳入sum時,并不是按照循環(huán)一個一個傳進(jìn)去的,而是每次傳了完整的向量數(shù)據(jù),那么再執(zhí)行sum時sum(y)=55,所以對于t=0時,x=8 再加上y=55,最后計算結(jié)果為63。那么,我們在使用’…’去傳入其他的參數(shù)的時候,一定要看清楚傳遞過程的描述,才不會出現(xiàn)的算法上的錯誤。

8. rapply函數(shù)

rapply是一個遞歸版本的lapply,它只處理list類型數(shù)據(jù),對list的每個元素進(jìn)行遞歸遍歷,如果list包括子元素則繼續(xù)遍歷。

函數(shù)定義:

rapply(object, f, classes = "ANY", deflt = NULL, how = c("unlist", "replace", "list"), ...)

參數(shù)列表:

  • object:list數(shù)據(jù)
  • f: 自定義的調(diào)用函數(shù)
  • classes : 匹配類型, ANY為所有類型
  • deflt: 非匹配類型的默認(rèn)值
  • how: 3種操作方式,當(dāng)為replace時,則用調(diào)用f后的結(jié)果替換原list中原來的元素;當(dāng)為list時,新建一個list,類型匹配調(diào)用f函數(shù),不匹配賦值為deflt;當(dāng)為unlist時,會執(zhí)行一次unlist(recursive = TRUE)的操作
  • …: 更多參數(shù),可選

比如,對一個list的數(shù)據(jù)進(jìn)行過濾,把所有數(shù)字型numeric的數(shù)據(jù)進(jìn)行從小到大的排序。

> x=list(a=12,b=1:4,c=c('b','a'))> y=pi> z=data.frame(a=rnorm(10),b=1:10)> a <- list(x=x,y=y,z=z)# 進(jìn)行排序,并替換原list的值> rapply(a,sort, classes='numeric',how='replace')$x$x$a[1] 12$x$b[1] 4 3 2 1$x$c[1] "b" "a"$y[1] 3.141593$z$z$a [1] -0.8356286 -0.8204684 -0.6264538 -0.3053884  0.1836433  0.3295078 [7]  0.4874291  0.5757814  0.7383247  1.5952808$z$b [1] 10  9  8  7  6  5  4  3  2  1> class(a$z$b)[1] "integer"

從結(jié)果發(fā)現(xiàn),只有$z$a的數(shù)據(jù)進(jìn)行了排序,檢查$z$b的類型,發(fā)現(xiàn)是integer,是不等于numeric的,所以沒有進(jìn)行排序。

接下來,對字符串類型的數(shù)據(jù)進(jìn)行操作,把所有的字符串型加一個字符串’++++’,非字符串類型數(shù)據(jù)設(shè)置為NA。

> rapply(a,function(x) paste(x,'++++'),classes="character",deflt=NA, how = "list")$x$x$a[1] NA$x$b[1] NA$x$c[1] "b ++++" "a ++++"$y[1] NA$z$z$a[1] NA$z$b[1] NA

只有$x$c為字符串向量,都合并了一個新字符串。那么,有了rapply就可以對list類型的數(shù)據(jù)進(jìn)行方便的數(shù)據(jù)過濾了。

9. eapply函數(shù)

對一個環(huán)境空間中的所有變量進(jìn)行遍歷。如果我們有好的習(xí)慣,把自定義的變量都按一定的規(guī)則存儲到自定義的環(huán)境空間中,那么這個函數(shù)將會讓你的操作變得非常方便。當(dāng)然,可能很多人都不熟悉空間的操作,那么請參考文章 揭開R語言中環(huán)境空間的神秘面紗,解密R語言函數(shù)的環(huán)境空間。

函數(shù)定義:

eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE)

參數(shù)列表:

  • env: 環(huán)境空間
  • FUN: 自定義的調(diào)用函數(shù)
  • …: 更多參數(shù),可選
  • all.names: 匹配類型, ANY為所有類型
  • USE.NAMES: 如果X為字符串,TRUE設(shè)置字符串為數(shù)據(jù)名,F(xiàn)ALSE不設(shè)置

下面我們定義一個環(huán)境空間,然后對環(huán)境空間的變量進(jìn)行循環(huán)處理。

# 定義一個環(huán)境空間> env# 向這個環(huán)境空間中存入3個變量> env$a <- 1:10> env$beta <- exp(-3:3)> env$logic <- c(TRUE, FALSE, FALSE, TRUE)> env# 查看env空間中的變量> ls(env)[1] "a"     "beta"  "logic"# 查看env空間中的變量字符串結(jié)構(gòu)> ls.str(env)a :  int [1:10] 1 2 3 4 5 6 7 8 9 10beta :  num [1:7] 0.0498 0.1353 0.3679 1 2.7183 ...logic :  logi [1:4] TRUE FALSE FALSE TRUE

計算env環(huán)境空間中所有變量的均值。

> eapply(env, mean)$logic[1] 0.5$beta[1] 4.535125$a[1] 5.5

再計算中當(dāng)前環(huán)境空間中的所有變量的占用內(nèi)存大小。

# 查看當(dāng)前環(huán)境空間中的變量> ls() [1] "a"     "df"     "env"    "x"     "y"    "z"    "X"  # 查看所有變量的占用內(nèi)存大小> eapply(environment(), object.size)$a2056 bytes$df1576 bytes$x656 bytes$y48 bytes$z952 bytes$X1088 bytes$env56 bytes

eapply函數(shù)平時很難被用到,但對于R包開發(fā)來說,環(huán)境空間的使用是必須要掌握的。特別是當(dāng)R要做為工業(yè)化的工具時,對變量的精確控制和管理是非常必要的。

本文全面地介紹了,R語言中的數(shù)據(jù)循環(huán)處理的apply函數(shù)族,基本已經(jīng)可以應(yīng)對所有的循環(huán)處理的情況了。同時,在apply一節(jié)中也比較了,3種數(shù)據(jù)處理方面的性能,R的內(nèi)置向量計算,要優(yōu)于apply循環(huán),大幅優(yōu)于for循環(huán)。那么我們在以后的R的開發(fā)和使用過程中,應(yīng)該更多地把apply函數(shù)使用好。

忘掉程序員的思維,換成數(shù)據(jù)的思維,也許你就一下子開朗了。

轉(zhuǎn)載請注明出處:
http://blog.fens.me/r-apply/

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
R中利用apply、tapply、lapply、sapply、mapply、table等函數(shù)進(jìn)行分組統(tǒng)計
【數(shù)據(jù)分析與挖掘】R語言apply系列和which函數(shù)
R語言 | 第13期.apply家族入門應(yīng)用
R語言進(jìn)階之3:數(shù)據(jù)匯總/透視/提煉
R數(shù)據(jù)分析:apply()的各種變體你分清了嗎?
30 天學(xué)會R DAY 13:apply族函數(shù):用來批量作業(yè)的函數(shù)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服