介于在网上看了很多,有些写的不够清楚,希望我下面能说清楚
1. apply
apply(data,margin,function
-
apply
函数有3个参数:
a. 第一个为输入的数据,要求为矩阵或者数据框的形式
b. 第二个参数指的是按行还是按列来进行计算,为1时是按行进行计算,为2时是按列进行计算
c. 第三个参数指的是使用什么函数 - 例子
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
2. lapply
lapply(x,function)
-
lapply
有2个参数:a. 第一个参数是需要的数据,可以是向量或者 列表 的形式
b. 第二个参数是函数
注:lapply 返回的是一个列表
- 例子
> 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
3.sapply
sapply(x,function)
sapply
与lapply
其实是一样的,只是返回的结果是一个向量或者是一个矩阵,当无法将一个结果简化为矩阵时,就会返回一个列表
- sapply 有2个参数:
a. 第一个参数是需要的数据,一般向量,也可为列表
b. 第二个参数是函数
注: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
4. vapply(sapply的安全版本)
可以发现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
5. mapply (sapply的多元版本)
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
6. Map(lapply的多元版本)
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语言编程指南》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。