我有一个相当简单的问题,但遗憾的是无法得到结果: 我想将GBSVolatility函数应用于data.frame的每一行。
我做了以下事情:
> 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)
但它也不起作用。
你还有其他建议吗?感谢
答案 0 :(得分:3)
如果数据框的一列或多列是字符,则在行上申请数据框会将数字转换为字符。如此简单的解决方法是再次转换为vol:
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 * ply或者其他东西......
可能这更优雅:
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
答案 1 :(得分: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)
答案 2 :(得分:1)
这是我能做的最好的事情。它多一点魔法&#34;但到目前为止,我认为最具可读性的选择呢?
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)))