介於在網上看了不少,有些寫的不夠清楚,但願我下面能說清楚編程
apply(data,margin,function
安全
apply
函數有3個參數:mat <- matrix(c(1,2,3,4),nrow = 2) > mat [,1] [,2] [1,] 1 3 [2,] 2 4 #按行來求和 > apply(mat,1,sum) [1] 4 6 #按列來求和 > apply(mat,2,sum) [1] 3 7
lapply(x,function)
app
lapply
有2個參數:a. 第一個參數是須要的數據,能夠是向量或者 列表 的形式 函數
b. 第二個參數是函數code
注:lapply 返回的是一個列表orm
> a <- c(1,2,3) > lapply(a, rnorm) [[1]] [1] 0.2791608 [[2]] [1] -0.07617067 1.39466313 [[3]] [1] 0.16453412 1.57785198 -0.06192266 > lapply(a, function(x) x^2) [[1]] [1] 1 [[2]] [1] 4 [[3]] [1] 9
sapply(x,function)
io
sapply
與lapply
實際上是同樣的,只是返回的結果是一個向量或者是一個矩陣,當沒法將一個結果簡化爲矩陣時,就會返回一個列表function
a. 第一個參數是須要的數據,通常向量,也可爲列表模板
b. 第二個參數是函數map
注:sapply 返回的是一個向量或矩陣
> sapply(1:10,function(x) x^2) [1] 1 4 9 16 25 36 49 64 81 100 > sapply(1:10,function(x) c(x,x^2)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 2 3 4 5 6 7 8 9 10 [2,] 1 4 9 16 25 36 49 64 81 100 #此時返回的結果是跟lapply函數是同樣的,這是由於沒法將一個結果簡化爲矩陣 > sapply(a, rnorm) [[1]] [1] 0.9481593 [[2]] [1] 0.9141587 -1.2987320 [[3]] [1] 0.4243788 -1.1125453 -1.0510732
能夠發現sapply
函數很靈活,既能夠返回向量,又能夠返回矩陣,又能夠返回列表,但這種靈活有時候會有風險。vapply
函數就是sapply
函數的升級版本,vapply
函數經過付加一個參數來設定每次返回值的模板。
vapply(x, function, FUN.VALUE)
sapply
徹底同樣,就多了第三個參數,就是累設定咱們返回值的模板的> a <- list(c(1,2),c(2,3),c(1,3)) > sapply(a, function(x) x^2) [,1] [,2] [,3] [1,] 1 4 1 [2,] 4 9 9 #numeric(2)的意思是指定了模板numeric(2),意味着每次迭代都返回一個包含2個元素的數值向量 > vapply(a, function(x) x^2,numeric(2)) [,1] [,2] [,3] [1,] 1 4 1 [2,] 4 9 9 #可是當list變成以下形式時,則會報錯,這是由於咱們設定了模型,當不能按照模板輸出時,函數就會返回錯誤信息 > b <- list(c(1,2),c(2,3),c(1,3,3)) > sapply(b, function(x) x^2) [[1]] [1] 1 4 [[2]] [1] 4 9 [[3]] [1] 1 9 9 > vapply(b, function(x) x^2,numeric(2)) Error in vapply(b, function(x) x^2, numeric(2)) : values must be length 2, but FUN(X[[3]]) result is length 3
mapply
能夠看作是sapply
的多元版本,sapply
只能在一個向來上迭代,而mapply
能夠在多個向量上迭代。
mapply(function(x,y) x,y)
> mapply(function(a,b,c) a*b + b*c + a*c, a = c(1,2,3), b = c(5,6,7), c = c(-1,-2,-3) ) [1] -1 -4 -9 > df <- data.frame(x = c(1,2,3), + y = c(3,4,5)) > mapply(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y) [,1] [,2] [,3] [1,] 1 2 3 [2,] 3 4 5 [3,] 4 6 8
Map
爲lapply
的多元版本,故一般返回一個列表的形式
> df <- data.frame(x = c(1,2,3), + y = c(3,4,5)) > Map(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y) [[1]] [1] 1 3 4 [[2]] [1] 2 4 6 [[3]] [1] 3 5 8
參考資料: 任坤《R語言編程指南》