在R语言中替换矩阵中的0:用下方行元素填补并上移
如何在R中分别去除矩阵两列的0并让下方元素上移填补?
问题描述
你有一个包含1862行的矩阵,示例结构如下:
sc_matrix <- matrix(c(227,0,272,298,0,353,rep(0,7),0,235,279,0,306,0,rep(0,7),387), ncol=2, dimnames=list(NULL, c("sc_start","sc_end")))
矩阵具体内容:
sc_start sc_end [1,] 227 0 [2,] 0 235 [3,] 272 279 [4,] 298 0 [5,] 0 306 [6,] 353 0 [7,] 0 0 [8,] 0 0 [9,] 0 0 [10,] 0 0 [11,] 0 0 [12,] 0 0 [13,] 0 387
需要分别对sc_start和sc_end列执行操作:删除列中所有0,删除后下方元素自动上移填补空位,最终得到如下结构的矩阵:
sc_start sc_end [1,] 227 235 [2,] 272 279 [3,] 298 306 [4,] 353 387
解决方案
在R中可以通过两种简洁方式实现需求,核心思路是按列筛选非0元素,再重新组合矩阵:
方法1:单独处理列后合并
# 提取sc_start列的非0元素 sc_start_clean <- sc_matrix[, "sc_start"][sc_matrix[, "sc_start"] != 0] # 提取sc_end列的非0元素 sc_end_clean <- sc_matrix[, "sc_end"][sc_matrix[, "sc_end"] != 0] # 合并为新矩阵并保留原列名 clean_matrix <- cbind(sc_start_clean, sc_end_clean) colnames(clean_matrix) <- colnames(sc_matrix)
方法2:用apply批量处理列
# 对每一列应用筛选非0元素的函数 clean_matrix <- apply(sc_matrix, 2, function(col) col[col != 0]) # 转置矩阵恢复行优先的结构 clean_matrix <- t(clean_matrix) # 保留原列名 colnames(clean_matrix) <- colnames(sc_matrix)
补充说明
- 两种方法都会严格保留每列非0元素的原始顺序,自动完成元素上移填补空位的操作。
- 如果两列非0元素数量不同,R会自动循环补齐较短的列(从你的需求场景来看,两列最终长度应该一致,无需额外处理)。
内容的提问来源于stack exchange,提问作者Arne Brandschwede
相关产品推荐
相关产品推荐

