2012-02-10 88 views
0

的每一行的功能我创造了这个功能:传递参数从矩阵

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(b,1,nDone) 

并得到以下错误:

Error in under/strike : 'strike' is missing 

我也试过:

lapply(b,nDone) 

我得到以下错误:

Error in under/strike : 'strike' is missing 

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

+0

嗯....这是完全一样的[最后](http://stackoverflow.com/questions/9235781/passing-arguments-to-a-function-in-a-single-vector)的问题。 – joran 2012-02-10 23:33:57

+0

嗨乔兰,我知道它看起来是一样的,我当然不会浪费任何人的时间。在这个问题现在我试图将矩阵的每一行传递给一个函数。再次感谢您的评论。 – user1181337 2012-02-10 23:43:37

+0

是的。 @ joran对上一个问题的回答(实际上是一个评论)也应该能够回答这个问题。他留下了一点空间来进行斗争/解释。我建议你看看他的评论,看看你是否可以理解如何处理它,然后(如果你不能)回来并要求澄清那里... – 2012-02-10 23:59:52

回答

6

这应该工作:

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

有什么错你的版本是,通过应用(),您的nDone()函数获取全行作为一个参数,即向量下通过了“罢工“,而对其他论点则毫无用处。解决方法是使用do.call()。

+0

感谢Flodel!并感谢所有发布的人! – user1181337 2012-02-11 06:59:44

3

值得一提的是,如果你想要的功能,结果绑定到原来的矩阵,你可以使用mdplyplyr

> 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