【问题标题】:Replacing values in each column independently according to value order in R根据R中的值顺序独立替换每列中的值
【发布时间】: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


    【解决方案1】:

    我们可以使用applyrank

    apply(mat, 2, function(x) 
        replace(x,rank(x, ties.method='first') <k, 0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      相关资源
      最近更新 更多