2016-04-03 31 views
1

我有一个包含数值的矩阵nxn。我需要找到哪些是每列中具有最高值的3列和其余列中的输入零。R矩阵:在最低值的列中输入零

例如,在列将是:

  a b r t  y n 
user1 1.3 2 4 5.5 0 0 
user2  8 0 1.5 5  3 7.2 

所得矩阵将是:

  a b r t  y n 
user1  0 2 4 5.5 0 0 
user2  8 0 0 5  0 7.2 

回答

4

我们通过使用applymatrix的行(与MARGIN=1rank元素环,创建逻辑向量(< 4),使用ifelse来替换不是最高的元素3,并转置(t)输出。

m2 <- m1 
m2[] <-t(apply(m1, 1, function(x) 
     ifelse(rank(-x, ties.method='min') < 4, x, 0))) 
m2 
#  a b r t y n 
#user1 0 2 4 5.5 0 0.0 
#user2 8 0 0 5.0 0 7.2 

或者另一种选择是

library(dplyr) 
m1[ave(m1, row(m1), FUN=min_rank) < 4] <- 0 
4

如果效率的问题,我会尝试的matrixStats

m[matrixStats::rowRanks(m) < 4] <- 0 
m 
#  a b r t y n 
# user1 0 2 4 5.5 0 0.0 
# user2 8 0 0 5.0 0 7.2 

如果关系很重要,使用ties.method参数