как я могу извлечь позицию значений, которые соответствуют логическому выбору в матрице в r? - PullRequest
1 голос
/ 30 мая 2020

Как я могу извлечь позицию каждого 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 |
+---+---+---+
|   |   |   |
+---+---+---+

Это очень базовый c вопрос, на который я пока не нашел ответа.

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Если мы не хотим переупорядочивать индекс по столбцу

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 голос
/ 30 мая 2020

Вы можете найти индекс строки / столбца для каждой позиции, где 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

Матрицы / фреймы данных не могут иметь неравную длину, поэтому мы можем split индекс строки по индексу столбца, чтобы получить именованный список .

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

#$`1`
#[1] 1 3

#$`2`
#[1] 2

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