首页 > 解决方案 > 如何根据 R 中稀疏矩阵的阈值替换行值?

问题描述

我有一个非常大的稀疏矩阵(40,000 x 100,000+),如果它大于某个阈值,我想用 1 替换一个元素。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个向量,它是行的长度)所以我想逐行检查特定行的元素是否大于唯一阈值为那一行。

我最初通过遍历稀疏矩阵的所有非零元素来尝试使用 for 循环来解决这个问题,但这花费了太长时间,因为我有超过 1 亿个元素要通过。

number_of_elem <- matrix@x %>% length()
for (j in 1:number_of_elem){

  threshold <- thres_array[j] 

  if (threshold == 0){
    next
  }

  if (matrix@x[j] > threshold){

    matrix@x[j] <- 1

  }

}

然后我开始尝试使用 apply 函数,但我无法准确解决如果阈值为零时跳过阈值的问题。作为参考,我首先计算了每一行的分位数,并将阈值设置为高于第 95 个百分位数。由于它是一个稀疏矩阵,因此某些阈值为零。

关于如何解决这个问题的任何想法?根据我在 R 中所知道的,最好将代码矢量化并避免 for 循环,但我想不出一种可持续的方法。

标签: roptimizationsparse-matrixmemory-efficient

解决方案


我修改了@Bas 解决方案,以便它利用矩阵的稀疏性来提高性能。

mat@x[mat@x > thres_array[mat@i + 1] ] <- 1

mat@x给出稀疏矩阵的非零元素,并mat@i给出非零元素所属的行(你必须加 1,因为它是零索引的)。由于 的元素thres_array基于相应的行,您可以从中创建一个逻辑向量mat@x > thres_array[mat@i + 1]并将这些值重新分配为 1。


推荐阅读