R矩阵:在具有最低值的列中输入零

时间:2016-04-03 12:07:57

标签: r matrix input

我有一个带数值的矩阵nxn。我需要找到每列中具有最高值的3列和其余列中的inpout零。

例如,在行上将是:

           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

2 个答案:

答案 0 :(得分:4)

我们使用matrix(使用apply),MARGIN=1元素遍历rank的行,创建逻辑向量(< 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

答案 1 :(得分: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参数