用下一行的元素替换 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_start
和 sc_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)
如果关于两列在删除零后高度相同的假设不正确,那么我们可以尝试填充使它们的长度相同,然后采用与上述类似的方法。
我有一个矩阵,它看起来像这样:
> 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_start
和 sc_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)
如果关于两列在删除零后高度相同的假设不正确,那么我们可以尝试填充使它们的长度相同,然后采用与上述类似的方法。