Примените функцию с внешним, взяв столбцы двух матриц в качестве элементов интереса - PullRequest
6 голосов
/ 02 июня 2011

Рассмотрим матрицы d и r с dim(d) = J x D и dim(r) = J x R.Пусть fun (a, b) будет функцией, которая принимает два вектора одинаковой длины и возвращает некоторое число.
Я хочу трактовать столбцы d и r соответственно как мои единицы интереса и применять outer to им.

Следующий код выполняет это, создавая списки столбцов d и r, а затем используя outer и sapply:

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 Ответ

10 голосов
/ 02 июня 2011

Вы довольно близко. Как описано в этом связанном вопросе , все, что вам нужно, это функция Vectorize() для преобразования вашей функции Fun() в векторизованную версию:

VecFun <- Vectorize( Fun )

Тогда вы можете просто сделать:

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

например. если вы определите

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...