将参数传递给矩阵每行的函数

时间:2012-02-10 23:30:03

标签: r

我创建了这个函数:

nDone<- function (under,strike,ttoe,vol,rf,dy) {
    return(pnorm(((log(under/strike) + (rf-dy+(vol^2)/2)*ttoe)/(vol*(ttoe^0.5)))))
 }

nDone(90,100,3,0.17,0.05,0)
[1] 0.6174643

到目前为止,这很好并且有效。现在我希望将函数应用于矩阵的每一行。

b<- c(90,95,100,100,3,2,0.17,0.18,0.05,0.05,0,0)
dim(b) <- c(2,6)

给出了:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   90  100    3 0.17 0.05    0
[2,]   95  100    2 0.18 0.05    0

所以现在我想将每行中的元素传递给函数。我尝试过使用apply:

apply(b,1,nDone)

并收到以下错误:

Error in under/strike : 'strike' is missing

我也试过了:

lapply(b,nDone)

我收到以下错误:

Error in under/strike : 'strike' is missing

我想要的是该功能的多个结果。我在这里做错了什么?

2 个答案:

答案 0 :(得分:6)

这应该有效:

apply(b, 1, function(x)do.call(nDone, as.list(x)))

你的版本出了什么问题,通过apply(),你的nDone()函数将整行作为一个参数,即在“strike”下传递的向量,而其他参数则没有。解决方案是使用do.call()。

答案 1 :(得分:3)

值得一提的是,如果您想将函数的结果绑定到原始矩阵,可以使用mdply中的plyr

> library(plyr)
> mdply(b, nDone)

  X1  X2 X3   X4   X5 X6        V1
1 90 100  3 0.17 0.05  0 0.6174643
2 95 100  2 0.18 0.05  0 0.6249916