1

使用 R:如果我有一个方阵,如果对角线上的值小于五,那么删除行和列的最简单(也是最快)的方法是什么?例如

       x1  x2  x3  x4
    x1 13  15  12  25
    x2 23  4   23  34
    x3 21  11  1   11
    x4 11  22  23  33

该代码将删除第 2 行和第 2 列,以及第 3 行和第 3 列。我尝试执行 for(i in 1:nrow(Mx)),但删除行会更改总行数。

最终的矩阵看起来像

       x1  x4
    x1 13  25
    x4 11  33
4

2 回答 2

5

像这样使用diag函数和逻辑比较<以及[子集运算符......

idx <- ! diag(m) < 5
m <- m[ idx , idx ]

例如

m
#   x1 x2 x3 x4
#x1 13 15 12 25
#x2 23  4 23 34
#x3 21 11  1 11
#x4 11 22 23 33

idx <- ! diag(m) < 5    
m <- m[ idx , idx ]

m
#   x1 x4
#x1 13 25
#x4 11 33
于 2013-07-17T15:24:47.167 回答
0

不是更优雅或最快的解决方案,但它有效

mat <- matrix(c(13, 23, 21, 11, 15, 4, 11, 22, 12, 23,
                1, 23, 25, 34, 11, 33), nrow = 4)

ind <- which(diag(diag(mat)) > 5, arr.ind = TRUE)

mat[ind[,1], ind[,2]]
##      [,1] [,2]
## [1,]   13   25
## [2,]   11   33
于 2013-07-17T15:30:10.530 回答