如何提取与 r 矩阵中的逻辑选择匹配的值的位置?

how can I extract a position of values that match a logical selection in a matrix in r?

如何提取以下矩阵中每列每个 0 的位置:

bm <- matrix(c(0,1,0,1,1,1,0,1,1,1,1,0,0,0,0),5,3) 

给出的矩阵如下:

+---+---+---+
| x | y | z |
+---+---+---+
| 0 | 1 | 1 |
+---+---+---+
| 1 | 0 | 0 |
+---+---+---+
| 0 | 1 | 0 |
+---+---+---+
| 1 | 1 | 0 |
+---+---+---+
| 1 | 1 | 0 |
+---+---+---+

所以我想要一个数据框或矩阵,无论哪种形式,根据行或列的位置,每个 0 的位置更容易。类似于:

+---+---+---+
| x | y | z |
+---+---+---+
| 1 | 2 | 2 |
+---+---+---+
| 3 |   | 3 |
+---+---+---+
|   |   | 4 |
+---+---+---+
|   |   | 5 |
+---+---+---+
|   |   |   |
+---+---+---+

这是一个非常基本的问题,我还没有立即找到答案。

如果我们不想按列重新排序索引

row(bm) * !bm

如果我们要重新排序,一个选项是row乘以逻辑矩阵然后重新排序位置

apply(row(bm)* !bm, 2, function(x) c(x[x!=0], x[x==0]))
#      [,1] [,2] [,3]
#[1,]    1    2    2
#[2,]    3    0    3
#[3,]    0    0    4
#[4,]    0    0    5
#[5,]    0    0    0

或使用order

apply(row(bm) * !bm, 2, function(x) x[order(!x)])

或其他选择

sapply(asplit(replace(row(bm), !!bm, NA), 2),
       function(x)  x[order(is.na(x))])

您可以找到 row/column 每个位置的索引 bm = 0

mat <- which(bm == 0, arr.ind = TRUE)

#     row col
#[1,]   1   1
#[2,]   3   1
#[3,]   2   2
#[4,]   2   3
#[5,]   3   3
#[6,]   4   3
#[7,]   5   3

Matrices/Dataframes长度不能不等,所以我们可以split行索引列索引得到命名列表。

split(mat[, 1], mat[, 2])

#$`1`
#[1] 1 3

#$`2`
#[1] 2

#$`3`
#[1] 2 3 4 5