向量的笛卡爾或交叉積
要找到形式(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
有關相關概念和工具,請參閱組合學主題。