用下一行的元素替换 R 中矩阵中的零

Replace zeros in matrix in R with element from row below

我有一个矩阵,它看起来像这样:

 > sc_matrix
      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

一共1862行。

对于这两列,我想去掉零。具体来说,每次删除一个零时,下面的元素都会向上跳一行。例如,sc_matrix[2,1] 中的 0 被删除,sc_matrix[3,1] 中的 272 取而代之。同样,sc_matrix[1,2] 中的 0 被删除,sc_matrix[2,2] 中的 235 取而代之。这应该针对 sc_startsc_end 单独完成,以便最终矩阵如下所示:

     sc_start sc_end
[1,]      227    235
[2,]      272    279
[3,]      298    306
[4,]      353    387

知道怎么做吗?

df <- data.frame(
        sc_start = c(227,0,272,298,0,353,0,0,0,0,0,0,0),
        sc_end = c(0,235,279,0,306,0,0,0,0,0,0,0,387)
      )
df2 <- data.frame(
          sc_start = c(df$sc_start[!df$sc_start==0]),
          sc_end = c(df$sc_end[!df$sc_end==0])
       )

仅当删除零后两个系列的长度相等时才有效。

你可以试试这个:

# get a matrix of zeros of equal dimension
sc_matrix_2 <- 0 * sc_matrix

len <- rep(0, times=ncol(sc_matrix))

for(i in 1:ncol(sc_matrix))
{
    # get nonzero elements in order
    sc0 <- sc_matrix[,i]
    sc0 <- sc0[sc0 != 0]

    # count of nonzero elements
    len[i] <- length(sc0)

    sc_matrix_2[1:length(sc0),i] <- sc0
}

# cut off unnecessary zeros
sc_matrix_2 <- sc_matrix_2[1:max(len),]

这需要逐列,删除零并从中创建一个矩阵。如果每列中的非零项数不同,则输出行数是非零元素的最大值。未使用的单元格用零填充。

如果您确定矩阵会在两列具有相同大小的情况下崩溃,那么这是一个可行的解决方案:

col1 <- as.numeric(m[m[, 1] != 0, 1])
col2 <- as.numeric(m[m[, 2] != 0, 2])
matrix(c(col1, col2), nrow=length(col1), ncol=2)

Demo

如果关于两列在删除零后高度相同的假设不正确,那么我们可以尝试填充使它们的长度相同,然后采用与上述类似的方法。