一种方法是考虑构成所需输出的每一行的数据行的索引。使用您的数据:
mat <- matrix(c("A","B","A",
"A","A","B",
"B","A","A"), ncol = 3, byrow = TRUE)
我使用expand.grid() 创建这些索引。输出的第一行由mat 的第1 行与mat 的第1 行串联形成,依此类推。这些指数产生如下
> ind <- expand.grid(r1 = 1:3, r2 = 1:3)
> ind
r1 r2
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
请注意,要获得您的输出显示的内容,我们需要先取列r2,然后再取r1,而不是反过来。
现在我只是用ind 的第二列和ind 的第一列索引mat,并将其提供给paste0(),输出是一个向量,因此我们需要将其重塑为矩阵。
> matrix(paste0(mat[ind[,2], ], mat[ind[,1], ]), ncol = 3)
[,1] [,2] [,3]
[1,] "AA" "BB" "AA"
[2,] "AA" "BA" "AB"
[3,] "AB" "BA" "AA"
[4,] "AA" "AB" "BA"
[5,] "AA" "AA" "BB"
[6,] "AB" "AA" "BA"
[7,] "BA" "AB" "AA"
[8,] "BA" "AA" "AB"
[9,] "BB" "AA" "AA"
paste0() 步骤返回粘贴字符串的向量:
> paste0(mat[ind[,2], ], mat[ind[,1], ])
[1] "AA" "AA" "AB" "AA" "AA" "AB" "BA" "BA" "BB" "BB" "BA" "BA" "AB" "AA" "AA"
[16] "AB" "AA" "AA" "AA" "AB" "AA" "BA" "BB" "BA" "AA" "AB" "AA"
关于为什么上面显示的矩阵重组有效的诀窍是注意paste0() 的输出中的条目是列优先顺序,因为索引ind 是如何形成的。本质上,传递给paste0() 的两个参数是:
> mat[ind[,2], ]
[,1] [,2] [,3]
[1,] "A" "B" "A"
[2,] "A" "B" "A"
[3,] "A" "B" "A"
[4,] "A" "A" "B"
[5,] "A" "A" "B"
[6,] "A" "A" "B"
[7,] "B" "A" "A"
[8,] "B" "A" "A"
[9,] "B" "A" "A"
> mat[ind[,1], ]
[,1] [,2] [,3]
[1,] "A" "B" "A"
[2,] "A" "A" "B"
[3,] "B" "A" "A"
[4,] "A" "B" "A"
[5,] "A" "A" "B"
[6,] "B" "A" "A"
[7,] "A" "B" "A"
[8,] "A" "A" "B"
[9,] "B" "A" "A"
R 将每个都视为一个向量,因此输出是一个向量,但由于 R 按列存储矩阵,我们也用列粘贴的字符串填充输出矩阵。