如何根据R中稀疏矩阵的阈值替换行值?
我有一个非常大的稀疏矩阵(40000x100000+),如果一个元素大于某个阈值,我想用1替换它。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个表示行长度的向量),因此我想逐行检查特定行的元素是否大于该行的唯一阈值 我最初尝试使用for循环来解决这个问题,通过遍历稀疏矩阵的所有非零元素,但这花费了太长时间,因为我有超过1亿个元素要遍历如何根据R中稀疏矩阵的阈值替换行值?,r,optimization,sparse-matrix,memory-efficient,R,Optimization,Sparse Matrix,Memory Efficient,我有一个非常大的稀疏矩阵(40000x100000+),如果一个元素大于某个阈值,我想用1替换它。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个表示行长度的向量),因此我想逐行检查特定行的元素是否大于该行的唯一阈值 我最初尝试使用for循环来解决这个问题,通过遍历稀疏矩阵的所有非零元素,但这花费了太长时间,因为我有超过1亿个元素要遍历 number_of_elem <- matrix@x %>% length() for (j in 1:number_of_elem){ t
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
}
}
元素数%length()
for(j in 1:元素数){
阈值(阈值){
matrix@x[j] 你说得对,在R中,通常更倾向于将代码矢量化。幸运的是,如果我正确理解了你的问题,在这种情况下,这很容易做到
由于您没有提供任何数据(请以后提供),我在下面生成了一个阈值数组thres_数组
和一个矩阵mat
。
将thres\u数组
的每个条目与整个mat行
进行比较就是mat>thres\u数组
的问题,也可以在一行中应用阈值。
通过将thres\u数组中的零替换为Inf
,我们确保mat>thres\u数组中的零永远不会为真,因此跳过这些值
thres_array <- 0:9
mat <- matrix(runif(1000, max = 10), nrow = 10)
# get rid of zeros
thres_array[thres_array == 0] <- Inf
# apply threshold
mat[mat > thres_array] <- 1
我修改了@Bas解决方案,以便它利用矩阵的稀疏性来提高性能
mat@x[mat@x > thres_array[mat@i + 1] ] <- 1
mat@x[mat@x>thres_阵列[mat@i+1]]thres_阵列[mat@i+1]
并将这些值重新分配到1。什么是类(矩阵)
?>类(矩阵)[1]“dgCMatrix”属性(,“package”)[1]“矩阵”你提出的方法在理论上是可行的,但由于矩阵太大,我一直有内存问题。我想知道是否有办法利用稀疏矩阵的插槽特性。比如mat@x给出非零值和mat@i给出非零元素所属行的索引。好的,很清楚。抱歉没有拾取该索引。U幸运的是,我对R中的稀疏矩阵一无所知。我将保留这个答案,也许将来会有其他人从中受益。
mat@x[mat@x > thres_array[mat@i + 1] ] <- 1