使用"apply"将函数应用于参数特定于列的矩阵

Lyn*_*akr 7 r apply

我试图通过使用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=3c=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)

  • 而不是`split`你也可以使用`as.data.frame`. (2认同)
  • 我已经推出了第一个,现在希望能够为特别优雅的编辑添加投票. (2认同)

jor*_*ran 9

我不明白你为什么要打扰一个功能:

> 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)