根据R中的值顺序单独替换每列中的值

时间:2016-03-25 18:39:33

标签: r performance for-loop replace

我有一个矩阵:

mat <-structure(c(0.35, 0.27, 0.26, 0.28, 0.23, 0.37, 0.28, 0.27, 0.28, 
+ 0.22, 0.34, 0.27, 0.25, 0.25, 0.24, 0.35, 0.27, 0.25,      0.29, 0.27, 
+ 0.66, 0.37, 0.49, 0.46, 0.42, 0.64, 0.4, 0.48, 0.45,   0.42, 0.81, 
+ 0.39, 0.36, 0.37, 0.36, 0.34, 0.34, 0.43, 0.42, 0.34), .Dim = c(5L, 
+ 8L), .Dimnames = list(c("a", "b", "c", "d", "e"), c("f", "g", 
+ "h", "i", "j", "k", "l", "m")))

print(mat)
     f    g    h    i    j    k    l    m
a 0.35 0.37 0.34 0.35 0.66 0.64 0.81 0.34
b 0.27 0.28 0.27 0.27 0.37 0.40 0.39 0.34
c 0.26 0.27 0.25 0.25 0.49 0.48 0.36 0.43
d 0.28 0.28 0.25 0.29 0.46 0.45 0.37 0.42
e 0.23 0.22 0.24 0.27 0.42 0.42 0.36 0.34

对于每列,我希望将最低k值替换为0

为实现这一目标,我使用了for循环和ifelse:

k <- 3
for (j in 1:ncol(mat)) { mat[,j][tail(order(mat[,j], decreasing = TRUE, na.last = FALSE), ifelse(nrow(mat)<=k, 0, nrow(mat)-k))] <- 0 }

print(mat)
     f    g    h    i    j    k    l    m
a 0.35 0.37 0.34 0.35 0.66 0.64 0.81 0.34
b 0.27 0.28 0.27 0.27 0.00 0.00 0.39 0.00
c 0.00 0.00 0.25 0.00 0.49 0.48 0.00 0.43
d 0.28 0.28 0.00 0.29 0.46 0.45 0.37 0.42
e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

所以,这一切都运行良好但不幸的是,对于大量的列,循环非常慢。

我怎样才能加快速度? apply似乎不合适,因为我想要返回整个矩阵。

1 个答案:

答案 0 :(得分:2)

我们可以将rankapply(mat, 2, function(x) replace(x,rank(x, ties.method='first') <k, 0))

一起使用
{{1}}