R矩阵:在最低值的列中输入零
问题描述:
我有一个包含数值的矩阵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
答
我们通过使用apply
的matrix
的行(与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
答
如果效率的问题,我会尝试的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
参数