2010-12-10 50 views
3

我有一个相当简单的问题,但不幸的是只是不能得出结果: 我想将GBSVolatility函数应用于我的data.frame的每一行。对每一行应用GBSVolatility

我做了以下内容:

> vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, Time = 1/4, 
r = 0.01, b = 0.02, maxiter = 500) 
> foo$iv <- apply(foo, 1, vol) 

但是,这是行不通的。有人能告诉我为什么吗?

非常感谢

达尼

更新: 谢谢您的建议。我的数据帧被称为foo,看起来像这样

Date Price Strike Name 
1.1 100 1200 X 
1.1 120 1500 P 
etc. 

我想创建一个隐含波动率的新列。我试图申请,

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
    Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- apply(foo, 1, vol) 

但它没有工作。

您有任何其他建议吗?谢谢

回答

3

申请行上的数据帧将数字转换为字符,如果数据框的一列或多列是字符。所以容易的解决方法是再次转换卷:

vol <- function(x) GBSVolatility(as.numeric(x["Price"]), "c", S = 1000,  
    as.numeric(x["Strike"]), Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
apply(foo, 1, vol) 

这不是优雅。 我不能只是现在回忆起来的更优雅的方式,可能使用d *股或东西...

也许这是更优雅:

library(plyr) 
vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, 
    Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- adply(foo, 1, vol)$V1 
+0

这确实奏效,非常感谢! – Dani 2010-12-10 14:45:22

2

您不应该使用$,因为apply给出的输入是名为向量而不是data.frames。所以这应该工作:

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
     Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- apply(foo, 1, vol) 
+0

我认为你的意思是“命名向量”,而不是“矩阵”。如果'foo'是一个标准的数据框,'x'将是一个带有names属性的数字向量,而不是一个矩阵。 – 2010-12-10 11:53:18

+0

@Gavin好的一点,我从更多维度的情况推断了这一点。我会更新答案。 – mbq 2010-12-10 13:00:32

+0

非常感谢,但不幸的是它没有工作。我必须以不同的方式编写函数吗?我更新了我的Q. – Dani 2010-12-10 13:22:03

1

这是我能做到的最好。这有点“魔力”,但我认为迄今为止最具可读性的选项?

foo <- read.table(textConnection("Date Price Strike Name 
1.1 100 1200 X 
1.1 120 1500 P"),header=TRUE) 

foo$iv <- with(d,mapply(GBSVolatility, 
       Price,Strike, 
       MoreArgs=list(TypeFlag="c",S=1000, 
       Time=1/4,r=0.01,b=0.02,maxiter=500)))