批量處理函數有很重要的apply族函數:lapply sapply apply tapply mapply。比起傳統的for,while常常能獲得更好的性能。
apply函數(對一個數組按行或者按列進行計算):
使用格式為:
apply(X, MARGIN, FUN, ...)
其中X為一個數組;MARGIN為一個向量(表示要將函數FUN應用到X的行還是列),若為1表示取行,為2表示取列,為c(1,2)表示行、列都計算。
示例代碼:
> y<-matrix(2:13,ncol=3,4) > y [,1] [,2] [,3][1,] 2 6 10[2,] 3 7 11[3,] 4 8 12[4,] 5 9 13 > apply(y,1,sum) [1] 18 21 24 27 > apply(y,2,mean) [1] 3.5 7.5 11.5> apply(y,2,function(x)mean(x)+2) [1] 5.5 9.5 13.5函數lapply與函數sapply:
lapply的使用格式為:
lapply(X, FUN, ...)
lapply的返回值是和一個和X有相同的長度的list對象,這個list對象中的每個元素是將函數FUN應用到X的每一個元素。其中X為List對象(該list的每個元素都是一個向量),其他類型的對象會被R通過函數as.list()自動轉換為list類型。
函數sapply是函數lapply的一個特殊情形,對一些參數的值進行了一些限定,其使用格式為:
sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)
sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果參數simplify=TRUE,則函數sapply的返回值不是一個list,而是一個矩陣;若simplify=FALSE,則函數sapply的返回值仍然是一個list。
> y<-list(a=1:4,b=3:6,c=5:9) > y $a[1] 1 2 3 4$b[1] 3 4 5 6$c[1] 5 6 7 8 9 > lapply(y,function(x)x+1) $a[1] 2 3 4 5$b[1] 4 5 6 7$c[1] 6 7 8 9 10 > sapply(y,function(x)x+1) $a[1] 2 3 4 5$b[1] 4 5 6 7$c[1] 6 7 8 9 10函數mapply:
函數mapply是函數sapply的變形版,mapply 將函數 FUN 依次應用每一個參數的第一個元素、第二個元素、第三個元素上。函數mapply的使用格式如下:
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)
其中參數MoreArgs表示函數FUN的參數列表。
> a<-matrix(1:12,c(3,4)) > a [,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12 > mapply(function(x,y,z)x+1+y+z,a[,1],a[,2],a[,3]) [1] 13 16 19tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
x是需要處理的向量,INDEX是因子(因子列表),FUN是需要執行的函數,simplify指是否簡化輸入結果(考慮sapply對於lapply的簡化)
> n <- 17 > fac <- factor(rep(1:3, length = n), levels = 1:5) > fac [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2Levels: 1 2 3 4 5 > table(fac) fac1 2 3 4 5 6 6 5 0 0 > tapply(1:n, fac, sum) 1 2 3 4 5 51 57 45 NA NA > tapply(1:n, fac, sum, simplify = FALSE) $`1`[1] 51$`2`[1] 57$`3`[1] 45$`4`NULL$`5`NULL > tapply(1:n, fac, range) $`1`[1] 1 16$`2`[1] 2 17$`3`[1] 3 15$`4`NULL$`5`NULL加入臨床科研討論群,請加13738062354或者pj1989zzj為好友,註明加群,就會拉你進群了。