R中的元素绑定

时间:2011-05-31 16:40:37

标签: r vectorization reduce elementwise-operations

我想要一个函数f,以便

(outer(X, Y, f))[i, j]是X的第i个元素和Y的第j个元素的并排连接,类似于c(X[i], Y[j]),或具有相似的结构。

此外,我希望这个结果可以重复这个过程,并且通过这种方式我们得到了

(outer(outer(X, Y, f), Z, f))[i, j, k]是X的第i个元素,Y的第j个元素和Z的第k个元素的并排连接,即相等或具有结构的东西类似于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”'。)

我可以使用什么来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:5)

函数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"