R语言基于矩阵dimnames对元素执行条件判断和批量赋值的高效方案
高效实现方案
最优向量化方案(推荐,性能最佳)
核心逻辑是将逐元素判断改为批量向量化运算,所有操作均为R底层实现,无显式循环开销,适合处理大型矩阵:
# 预先一次性提取所有行、列的前缀 row_prefix <- sub("_.*", "", rownames(m)) col_prefix <- sub("_.*", "", colnames(m)) # 通过广播运算生成相同前缀的位置掩码,直接批量置0 m[outer(row_prefix, col_prefix, FUN = `==`)] <- 0
该方案相比双层for循环性能提升可达数百倍,远高于apply家族实现的性能。
apply家族实现(仅做参考,性能弱于向量化方案)
如果需要用apply家族实现,可按以下方式编写:
row_prefix <- sub("_.*", "", rownames(m)) col_prefix <- sub("_.*", "", colnames(m)) m <- t(apply(m, 1, function(row_val, idx) { row_val[col_prefix == row_prefix[idx]] <- 0 return(row_val) }, idx = seq_along(rownames(m))))
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

