如何提取与 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
如何提取以下矩阵中每列每个 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