矢量的笛卡尔或交叉积

要找到形式(x, y)的每个向量,其中 x 是从向量 X 和 y 从 Y 中绘制的,我们使用 expand.grid

X = c(1, 1, 2)
Y = c(4, 5)

expand.grid(X, Y)

#   Var1 Var2
# 1    1    4
# 2    1    4
# 3    2    4
# 4    1    5
# 5    1    5
# 6    2    5

结果是一个 data.frame,每个向量传递给它一列。通常,我们想要采用集合的笛卡尔积,而不是扩展向量的网格。我们可以使用 uniquelapplydo.call

m = do.call(expand.grid, lapply(list(X, Y), unique))

#   Var1 Var2
# 1    1    4
# 2    2    4
# 3    1    5
# 4    2    5

将功能应用于组合

如果你希望将函数应用于每个结果组合 f(x,y),则可以将其添加为另一列:

m$p = with(m, Var1*Var2)
#   Var1 Var2  p
# 1    1    4  4
# 2    2    4  8
# 3    1    5  5
# 4    2    5 10

这种方法适用于我们需要的尽可能多的向量,但在两种特殊情况下,有时将结果放在矩阵中更合适,这可以通过 outer 实现:

uX = unique(X)
uY = unique(Y)

outer(setNames(uX, uX), setNames(uY, uY), `*`)

#   4  5
# 1 4  5
# 2 8 10

有关相关概念和工具,请参阅组合学主题。