矢量的笛卡尔或交叉积
要找到形式(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,每个向量传递给它一列。通常,我们想要采用集合的笛卡尔积,而不是扩展向量的网格。我们可以使用 unique
,lapply
和 do.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
有关相关概念和工具,请参阅组合学主题。