2011-06-05 17 views
1

是否有Vectorize版本使用apply而不是mapply? 我想矢量化一个函数,该函数以一种允许我将数组传递给该函数并返回矢量的方式接受矢量输入。适用于()而不是mapply()的Vectorize()的版本?

当然,我可以写我自己的包装,这工作得很好。但我想知道这个功能是否内置?

我也可以使用Vectorize,但后来我必须将矩阵输入转换为data.frame才能工作。例如:

LAMBDA <- cbind(c(1, .5, .5), c(.5, 1, .5), c(.5, .5, 1)) 
THETA <- c(0,0,1) 
NU <- 21 
my.data <- array(1:6, c(3,2)) 
my.fun <- Vectorize(pmt, vectorize.args="x") 

然后

> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
[1] 0.4404142 0.8130572 0.9667065 0.9961166 0.9996274 0.9999676 

这不是我想要的,但

> my.data <- data.frame(my.data) 
> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
     X1  X2 
0.8130572 0.9996274 

就是我想要的。

顺便说一句,pmt是来自mnormt包,是一个多元学生的t cdf。

回答

1

好像你要定义一个函数my.fun你在一个矩阵my.data通行证和my.fun将只是“知道”它需要的功能,适用于my.data每一列。这就是apply()函数所要做的;你不需要拨打Vectorize。那么为什么不这样做呢:

my.data <- array(1:6, c(3,2)) 

> apply(my.data, 2, pmt, mean=THETA, S=LAMBDA, df=NU) 

[1] 0.8130572 0.9996274 
+0

你的意思'my.data'可以是一个向量而不是矩阵吗?如果是这样,你可以把它做成一个列矩阵吗? – Aaron 2011-06-06 14:29:47

+0

如果是这样,所有你需要的是'apply(matrix(my.data,nrow = 3),2,pmt,mean = THETA,S = LAMBDA,df = NU)'。这适用于矢量和矩阵。 – Aaron 2011-06-06 14:37:23

+0

@亚伦的解决方案比我的解决方案要好,至少在可读性方面。我猜'Vectorize'确实在'args < - lapply(as.list(match.call())[ - 1L],eval,parent.frame())'中做了类似的事情。并不是我完全理解它。 – kalu 2011-06-07 12:42:28

相关问题