r - 如何根据 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 循环,但我想不出一种可持续的方法。
解决方案
我修改了@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。
推荐阅读
- javascript - 用图像填充数百个 SVG 路径会导致严重的性能问题
- python - 如何从数据框中的所有列名/标题中删除数字
- sitecore - Sitecore 9.1.1 从 8.2 升级 - 是否有任何数据库更改?
- docker-compose - Docker-compose 容器退出,代码为 0
- javascript - 如何使用 Reactjs 在内部呈现带有文本的复选框?
- angularjs - Angular 1 表单验证错误未显示
- dataset - 如何从 HDF 文件中提取新的 Xarray 数据集?
- algorithm - 使用 BubbleSort 完全排序所需的通过次数?
- java - 使用 WHERE 子句 JOIN 更新另一个表
- c++ - 在 Qt Creator 中调试 c++ 程序时如何正确忽略 throw 中断?