您可以像在向量中一样利用矩阵中的向量化。给定一个矩阵x
,x[, -1][x[, -ncol(x)] == 1] <- 1
可以完成您想要的操作。以下是示例和说明:
# Create sample matrix
set.seed(100)
x <- sample(c(0, 1, NA), 100, replace = TRUE)
x <- matrix(x, ncol = 10)
# Examine before replacement
x
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 0 1 1 1 0 0 1 1 1 NA
#> [2,] 0 NA NA NA NA 0 1 0 1 0
#> [3,] 1 0 1 1 NA 0 NA 1 NA 1
#> [4,] 0 1 NA NA NA 0 NA NA NA 1
#> [5,] 1 NA 1 NA 1 1 1 1 0 NA
#> [6,] 1 NA 0 NA 1 0 1 1 1 1
#> [7,] NA 0 NA 0 NA 0 1 NA NA 1
#> [8,] 1 1 NA 1 NA 0 1 NA 0 0
#> [9,] 1 1 1 NA 0 1 0 NA 0 0
#> [10,] 0 NA 0 0 0 0 NA 0 NA NA
# Replace any cell right-of-1 with 1
x[, -1][x[, -ncol(x)] == 1] <- 1
# Examine after replacement
x
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 0 1 1 1 1 0 1 1 1 1
#> [2,] 0 NA NA NA NA 0 1 1 1 1
#> [3,] 1 1 1 1 1 0 NA 1 1 1
#> [4,] 0 1 1 NA NA 0 NA NA NA 1
#> [5,] 1 1 1 1 1 1 1 1 1 NA
#> [6,] 1 1 0 NA 1 1 1 1 1 1
#> [7,] NA 0 NA 0 NA 0 1 1 NA 1
#> [8,] 1 1 1 1 1 0 1 1 0 0
#> [9,] 1 1 1 1 0 1 1 NA 0 0
#> [10,] 0 NA 0 0 0 0 NA 0 NA NA
以下是关于
x[, -1][x[, -ncol(x)] == 1] <- 1
如何工作的解释:
逻辑是将两个矩阵叠加在一起:
1.
x [,-1]
是原始矩阵
去掉第一列。这是所有可以更改的数据。第一列永远不会更改,因为左边没有任何东西。
2.
x [,-ncol(x)]
是原始矩阵
去掉最后一列。这是所有可以发出更改信号的数据。最后一列永远不会发出更改信号,因为它右边没有任何东西。
这两个矩阵具有相同的维度,因此如果叠加在一起,将使可以发出更改信号的单元格(矩阵2)与可能更改的单元格(矩阵1)对齐。
通过调用
x [,-1] [x [,-ncol(x)] == 1]
,我们要求返回第一个矩阵中的所有单元格(所有可能更改的单元格),其中第二个矩阵(所有发出信号的单元格)等于1。
<- 1
将这些单元格的值设置为1。