1 つのアプローチは、目的の出力の各行を構成するデータ行のインデックスを考えることです。データの使用:
mat <- matrix(c("A","B","A",
"A","A","B",
"B","A","A"), ncol = 3, byrow = TRUE)
を使用してこれらのインデックスを作成しますexpand.grid()
。mat
出力の最初の行は、 の行 1 と の行1 の連結などによって形成されますmat
。これらのインデックスは次のように生成されます
> 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
mat
ここで、 の 2 番目の列ind
と の 1番目の列にインデックスを付けて、それをベクトルである出力ind
に提供する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
がどのように形成されたかにより、 からの出力のエントリが列優先順になっていることに注意することです。基本的に、 に渡される 2 つの引数は次の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 は行列を列ごとに格納するため、出力行列も列ごとに貼り付けられた文字列で埋めます。