快速生成矩阵的笛卡尔积

Jos*_*ich 7 r matrix cartesian

假设我有一个x包含10行和2列的矩阵.我想生成一个M包含每对唯一行x的新矩阵 - 即一个包含55行和4列的新矩阵.

例如,

x <- matrix (nrow=10, ncol=2, 1:20)

M <- data.frame(matrix(ncol=4, nrow=55))
k <- 1
for (i in 1:nrow(x))
for (j in i:nrow(x))
{
    M[k,] <- unlist(cbind (x[i,], x[j,]))
    k <- k + 1
}
Run Code Online (Sandbox Code Playgroud)

那么,x是:

      [,1] [,2]
 [1,]    1   11
 [2,]    2   12
 [3,]    3   13
 [4,]    4   14
 [5,]    5   15
 [6,]    6   16
 [7,]    7   17
 [8,]    8   18
 [9,]    9   19
[10,]   10   20
Run Code Online (Sandbox Code Playgroud)

然后M有4列,前两行是一行,x接下来的两行是另一行x:

> head(M,10)
   X1 X2 X3 X4
1   1 11  1 11
2   1 11  2 12
3   1 11  3 13
4   1 11  4 14
5   1 11  5 15
6   1 11  6 16
7   1 11  7 17
8   1 11  8 18
9   1 11  9 19
10  1 11 10 20
Run Code Online (Sandbox Code Playgroud)

是否有更快或更简单(或两者)的方式在R中这样做?

Dir*_*tel 8

对此expand.grid()有用的功能:

R> GG <- expand.grid(1:10,1:10)
R> GG <- GG[GG[,1]>=GG[,2],]     # trim it to your 55 pairs
R> dim(GG)
[1] 55  2
R> head(GG)
  Var1 Var2
1    1    1
2    2    1
3    3    1
4    4    1
5    5    1
6    6    1
R> 
Run Code Online (Sandbox Code Playgroud)

现在您有'n*(n + 1)/ 2'子集,您可以简单地索引原始矩阵.