如何在下面的矩阵中提取每列每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))])
您可以在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
矩阵/数据框的长度不能相等,因此我们可以按列索引按行索引C0以获得命名列表。
split