我试图通过使用apply将用户定义的函数应用于矩阵来避免使用循环.我遇到的问题是我的函数使用了其他参数,它们对于矩阵的每一列都不同.以下是一个玩具示例.
说我有以下功能:
foo <- function(x, a, b, c) return( (a*x + b)^c )
Run Code Online (Sandbox Code Playgroud)
我想将它应用到一个矩阵bar使用的不同的价值观a,b以及c对每一列.
bar <- matrix(1:15, ncol = 3)
a <- 4:6
b <- 3:1
c <- 1:3
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对于第一列bar,然后a=4,b=3和c=1.我试过这个,
apply(bar, 2, foo, a=a, b=b, c=c)
Run Code Online (Sandbox Code Playgroud)
但这显然是不正确的,因为每个列在重新包装回第一个参数之前依次使用所有参数.有什么建议?
akr*_*run 12
我们可以split通过'column'(col(bar))来'bar',并且mapply我们可以将'foo'应用于'bar'的每一列的相应'a','b','c'值
mapply(foo, split(bar, col(bar)), a, b, c)
Run Code Online (Sandbox Code Playgroud)
或者不使用 apply
ind <- col(bar)
(a[ind]*bar +b[ind])^c[ind]
Run Code Online (Sandbox Code Playgroud)
我不明白你为什么要打扰一个功能:
> a <- matrix(4:6,nrow = 5,ncol = 3,byrow = TRUE)
> b <- matrix(3:1,nrow = 5,ncol = 3,byrow = TRUE)
> c <- matrix(1:3,nrow = 5,ncol = 3,byrow = TRUE)
> (a*bar + b)^c
[,1] [,2] [,3]
[1,] 7 1024 300763
[2,] 11 1369 389017
[3,] 15 1764 493039
[4,] 19 2209 614125
[5,] 23 2704 753571
Run Code Online (Sandbox Code Playgroud)