我有一个矩阵说" 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))
答案 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
。