使用外部应用函数将两个矩阵的列作为感兴趣的元素

时间:2011-06-01 21:06:26

标签: r

考虑使用dr的矩阵dim(d) = J x Ddim(r) = J x R。 让fun(a,b)成为一个函数,它接受两个相同长度的向量并返回一些数字 我想将dr的列分别视为我感兴趣的单位,并将outer应用于他们。

以下代码通过创建dr列的列表,然后同时使用outersapply来实现此目的:

d.cols <- split(d, col(d))
r.cols <- split(r, col(r))
outer(d.cols, r.cols,
      function(x,y) {
           sapply(seq_along(x),
                 function(i) {
                     Fun(x[[i]], y[[i]]) })} )

代码做我想要的并且相对有效,但是笨拙且不清楚。有没有更好的方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:10)

你非常接近。正如this related question中所述,您只需Vectorize()函数即可将Fun()函数转换为矢量化版本:

VecFun <- Vectorize( Fun )

然后你就可以做到:

outer(d.cols, r.cols, VecFun )

E.g。如果你定义

Fun <- function(a,b) sum(a+b)

r,d矩阵的定义如下:

J <- 5
D <- 3
R <- 4

d <- matrix( 1:(J*D), J, D)
r <- matrix( 1:(J*R), J, R)

然后你明白了:

> outer(d.cols, r.cols, VecFun)

   1   2   3   4
1 30  55  80 105
2 55  80 105 130
3 80 105 130 155