如果您不希望结果对象中的组合名称,那么我们可以结合@DWin 和@Owen 的答案的元素来提供一个真正矢量化的方法来解决这个问题。 (您可以将组合名称添加为行名称,并在最后添加一个额外的步骤。)
一、数据:
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)
从@DWin 的答案中获取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() 调用来修改行名:
> 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