向量的笛卡爾或交叉積

要找到形式(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

有關相關概念和工具,請參閱組合學主題。