我需要创建一个函数,它将根据矩阵中的值重新排列任何方阵。
所以如果我有这样的矩阵:
M <- matrix(1:16, ncol = 4)
M
#> [,1] [,2] [,3] [,4]
#> [1,] 1 5 9 13
#> [2,] 2 6 10 14
#> [3,] 3 7 11 15
#> [4,] 4 8 12 16
Run Code Online (Sandbox Code Playgroud)
重新排列后,它需要如下所示:
[,1] [,2] [,3] [,4]
[1,] 1 3 6 10
[2,] 2 5 9 13
[3,] 4 8 12 15
[4,] 7 11 14 16
Run Code Online (Sandbox Code Playgroud)
所以它是从最低(左上角)到最高(右下角)排序的,但数字是按对角线排序的(这是正确的词吗?)而不是按行或列排序。
我知道如何“手动”执行此操作,但我无法弄清楚此重新排列所依据的任何规则。
1) row(m) + col(m)沿反向对角线不变,因此:
M <- replace(m, order(row(m) + col(m)), m)
Run Code Online (Sandbox Code Playgroud)
给出:
> M
[,1] [,2] [,3] [,4]
[1,] 1 3 6 10
[2,] 2 5 9 13
[3,] 4 8 12 15
[4,] 7 11 14 16
Run Code Online (Sandbox Code Playgroud)
不清楚在对角线上排序是否意味着它们从存储顺序解散到反向对角线上,或者它们实际上在每个反向对角线内排序。在问题的例子中,两种解释给出了相同的答案;但是,如果您确实希望之后使用不同的数据在反向对角线内对结果进行排序,请应用此:
ave(M, row(M) + col(M), FUN = sort)
Run Code Online (Sandbox Code Playgroud)
2)更长的版本:
M2 <- matrix(m[order(unlist(tapply(seq_along(m), row(m) + col(m), c)))], nrow(m))
Run Code Online (Sandbox Code Playgroud)