矩阵中的行顺序,不包括R中的零值

时间:2016-02-16 14:18:03

标签: r matrix

我有一个矩阵说" mat"包含零值。例如:

> mat
     [,1] [,2] [,3] [,4] [,5]
 [1,]    2    5    1    4    3
 [2,]    0    0    2    4    3
 [3,]    2    5    0    3    1
 [4,]    4    5    2    3    1
 [5,]    1    5    2    3    4
 [6,]    2    5    1    4    3
 [7,]    0    0    0    5    1
 [8,]    1    5    4    2    3
 [9,]    3    5    1    0    2
[10,]    2    5    4    1    3

我希望得到矩阵指数的顺序'排除零值的行。但是,每行的零值应保留在结果矩阵中,但最后应保留在结果矩阵中。例如,对于给定的" mat"矩阵,结果应该是这样的:

> res
    [,1] [,2] [,3] [,4] [,5]
 [1,]    3    1    5    4    2
 [2,]    3    5    4    0    0
 [3,]    5    1    4    2    0
 [4,]    5    3    4    1    2
 [5,]    1    3    4    5    2
 [6,]    3    1    5    4    2
 [7,]    5    4    0    0    0
 [8,]    1    4    5    3    2
 [9,]    3    5    1    2    0
[10,]    4    1    5    3    2

我想出了以下代码:

if (sum(mat==0)>0){ # mat contains zeros
        mat[which(mat==0, arr.ind = TRUE)]=NA
        l=apply(mat, 1, function(x) order(x, na.last = NA))
        mat=t(sapply(l, '[', 1:max(sapply(l, length))))
        mat[which(is.na(mat), arr.ind = TRUE)]=0
        return(mat)
    }

你们在R中有更好的想法或更好的算法吗?感谢

测试数据:

mat <- structure(c(2, 0, 2, 4, 1, 2, 0, 1, 3, 2, 5, 0, 5, 5, 5, 5, 
0, 5, 5, 5, 1, 2, 0, 2, 2, 1, 0, 4, 1, 4, 4, 4, 3, 3, 3, 4, 5, 2, 0, 1, 
3, 3, 1, 1, 4, 3, 1, 3, 2, 3), .Dim = c(10L, 5L))

1 个答案:

答案 0 :(得分:3)

我注意到您在res中提供的订单是包含零的订单。我不知道这是不是你的意思(它不适合你的问题描述),但如果你想这样做,你可以这样做:

res <- apply(mat,1,function(i){
   out <- order(i)
   iszero <- i == 0
   c(out[!iszero[out]], i[iszero])
 })
 res <- t(res)

> res
      [,1] [,2] [,3] [,4] [,5]
 [1,]    3    1    5    4    2
 [2,]    3    5    4    0    0
 [3,]    5    1    4    2    0
 [4,]    5    3    4    1    2
 [5,]    1    3    4    5    2
 [6,]    3    1    5    4    2
 [7,]    5    4    0    0    0
 [8,]    1    4    5    3    2
 [9,]    3    5    1    2    0
[10,]    4    1    5    3    2

为您提供您提供的确切res