r - R中的元素绑定(bind)

标签 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”的对象。)

我可以用什么 f 来实现这一点?

谢谢!

最佳答案

函数Vectorize()是你的 friend 吗:定义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"

关于r - R中的元素绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190751/

相关文章:

python - 这个python函数可以向量化吗?

hadoop - 为什么减少输入记录与减少输出记录不同?

R 数据表搜索选项不处理外来编码(latin1)

gganimate 的舍入帧时间和平滑过渡

python - 使用索引数组中的索引元组索引多维数组 - NumPy/Python

f# - 将函数列表缩减为 bool 值

sympy - 使用不等式简化 Sympy 中的方程式

r - r caret 包中的 train 函数的模型输出尺寸巨大

r - ggplot() 图中的 2 个多项式回归

performance - 加速 FDR 估计的 MATLAB 代码