【问题标题】:R - change matrix values based on another matrix indicesR - 根据另一个矩阵索引更改矩阵值
【发布时间】:2020-10-01 14:10:38
【问题描述】:

我有两个矩阵:

m1 <- matrix(runif(750), nrow = 50, byrow=T)
m2 <- matrix(rep(TRUE,750), nrow = 50, byrow=T)

对于每个m1 行,我需要找到两个最低值的索引。然后,我需要使用剩余的索引(即不是两个最低值)在m2 中分配FALSE

一行很容易做到:

ind <- order(m1[1,], decreasing=FALSE)[1:2]
m2[1,][-ind] <- FALSE

因此,我可以使用循环对所有行执行相同操作:

for (i in 1:dim(m1)[1]){
  
  ind <- order(m1[i,], decreasing=FALSE)[1:2]
  m2[i,][-ind] <- FALSE
  
}

但是,在我的数据集中,这个循环的运行速度比我想要的要慢(因为我的矩阵非常大 - 500000x150000)。

有没有更快的R 方法在不使用循环的情况下达到相同的结果?

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    你可以试试下面的代码

    m2 <- t(apply(m1,1,function(x) x %in% head(sort(x),2)))
    

    【讨论】:

    • 如果矩阵非常大,排序的“partial=2”参数可能会更快
    【解决方案2】:

    你可以试试apply,因为你有矩阵:

    val <- rep(TRUE, ncol(m1))
    m3 <- t(apply(m1, 1, function(x) {val[-order(x)[1:2]] <- FALSE;val}))
    

    【讨论】:

    • 因为这是我的数据集最快的选项,所以我接受它作为答案。
    【解决方案3】:

    你可以这样做:

    m2 <- t(apply(m1, 1, function(x) rank(x)<3))
    

    【讨论】:

      【解决方案4】:

      使用pmap

      library(purrr)
      pmap_dfr(as.data.frame(m1), ~ min_rank(c(...)) < 3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        相关资源
        最近更新 更多