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

问题描述 投票:1回答:2

如何在下面的矩阵中提取每列每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 |
+---+---+---+
|   |   |   |
+---+---+---+

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

r matrix sapply
2个回答
3
投票

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

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))])

1
投票

您可以在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
© www.soinside.com 2019 - 2024. All rights reserved.