如果你不在結果對象中不需要組合名稱,那麼我們可以結合@Dinin's和@ Owen's Answers的元素來爲問題提供真正的矢量化方法。 (您可以在最後一個額外的步驟添加組合名稱爲行名。)
首先,數據:
dat <- read.table(con <- textConnection(" A B C D
w 0 0 1 1
x 0 1 0 1
y 0 0 1 1
z 0 0 0 1
"), header=TRUE)
close(con)
採取combn()
想法來自@迪文的答案,但使用它的行指數dat
:
combs <- combn(seq_len(nrow(dat)), 2)
的combs
現在索引行,我們要乘在一起的dat
行:
> combs
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 2 2 3
[2,] 2 3 4 3 4 4
現在我們將這個想法@Owen表現,即dat[i, ] * dat[j, ]
與i
和j
分別爲的combs
第一行和第二行。我們將其轉換爲data.matrix()
的矩陣,因爲這對於大型對象來說效率更高,但代碼也可以與dat
一起作爲數據幀使用。
mat <- data.matrix(dat)
mat[combs[1,], ] * mat[combs[2,], ]
主要生產:
> mat[combs[1,], ] * mat[combs[2,], ]
A B C D
w 0 0 0 1
w 0 0 1 1
w 0 0 0 1
x 0 0 0 1
x 0 0 0 1
y 0 0 0 1
要看到這是如何工作,注意mat[combs[k,], ]
產生與由組合指定的順序重複各行的矩陣:
> mat[combs[1,], ]
A B C D
w 0 0 1 1
w 0 0 1 1
w 0 0 1 1
x 0 1 0 1
x 0 1 0 1
y 0 0 1 1
> mat[combs[2,], ]
A B C D
x 0 1 0 1
y 0 0 1 1
z 0 0 0 1
y 0 0 1 1
z 0 0 0 1
z 0 0 0 1
要獲得正是OP發佈的內容,我們可以使用第二個combn()
電話修改rownames:
> out <- mat[combs[1,], ] * mat[combs[2,], ]
> rownames(out) <- apply(combn(rownames(dat), 2), 2, paste, collapse = "")
> out
A B C D
wx 0 0 0 1
wy 0 0 1 1
wz 0 0 0 1
xy 0 0 0 1
xz 0 0 0 1
yz 0 0 0 1
感謝您的版本運行速度非常快。 – psiu