【发布时间】:2016-03-25 18:39:32
【问题描述】:
我有一个矩阵:
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 似乎不适合,因为我想返回整个矩阵。
【问题讨论】:
标签: r performance for-loop replace