поэлементное связывание в R - PullRequest
4 голосов
/ 31 мая 2011

Я хочу функцию f такую, чтобы

(outer(X, Y, f))[i, j] - это параллельная конкатенация i-го элемента X и j-го элемента Y, что-то вроде c(X[i], Y[j]) или имеющая подобную структуру.

Кроме того, я хочу, чтобы этот результат был таким, чтобы процесс мог повторяться, и, таким образом, мы получаем, что

(outer(outer(X, Y, f), Z, f))[i, j, k] - это параллельная конкатенация i-го элемента X, j-го элемента Y и k-го элемента Z, то есть чего-то равного или имеющего структуру, аналогичную это, c(X[i], Y[j], Z[k]).

В конечном итоге я стремлюсь определить функцию, подобную этой:

foo <- function(a.list) {
  Reduce(function(x, y) outer(x, y, f), a.list)
}

такой, что если

A <- foo(list(v_1, ..., v_p))

, тогда dim(A) будет c(length(v_1), ..., length(v_p)), а

A[i_1, ..., i_p] == c(v_1[i_1], ..., v_p[i_p])

для всех допустимых наборов индексов (i_1, ..., i_p).

Например:

> foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))
, , 1

               [,1]           [,2]           [,3]
[1,] c("A", 3, "f") c("A", 4, "f") c("A", 5, "f")
[2,] c("B", 3, "f") c("B", 4, "f") c("B", 5, "f")

, , 2

               [,1]           [,2]           [,3]
[1,] c("A", 3, "g") c("A", 4, "g") c("A", 5, "g")
[2,] c("B", 3, "g") c("B", 4, "g") c("B", 5, "g")

( ПРИМЕЧАНИЕ : я не знаю, является ли массив векторов, как результат, показанный в приведенном выше примере, даже допустимым / возможным в R, но я использую выражения типа c("A", 3, "f"), чтобы предложить ' некоторый вектороподобный объект с элементами "A", 3 и "f" '.)

Что я могу использовать для f для достижения этого?

Спасибо!

1 Ответ

5 голосов
/ 31 мая 2011

Функция Vectorize() является вашим другом здесь: определите f как:

f <- Vectorize( function(a,b) c(as.list(a), as.list(b)), SIMPLIFY = FALSE )

Тогда вы можете сделать (с вашим определением foo выше):

z <- foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))

Например, вы можете проверить, что записи соответствуют вашему примеру выше:

> z
, , 1

     [,1]   [,2]   [,3]  
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3

, , 2

     [,1]   [,2]   [,3]  
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3

> z[2,2,2]
[[1]]
[[1]][[1]]
[1] "B"

[[1]][[2]]
[1] 4

[[1]][[3]]
[1] "g"
...