介于在网上看了不少,有些写的不够清楚,但愿我下面能说清楚编程
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语言编程指南》