我有一个矩阵:
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
似乎不合适,因为我想要返回整个矩阵。
答案 0 :(得分:2)
我们可以将rank
与apply(mat, 2, function(x)
replace(x,rank(x, ties.method='first') <k, 0))
{{1}}