Как определить отсутствующие строки / столбцы в матрице, где есть ноль?(симметричное несоответствие) - PullRequest
0 голосов
/ 17 мая 2019

Как я могу сделать так, чтобы R мог идентифицировать отсутствующие строки / столбцы в матрице и вставить значения этих строк / столбцов, равные 0?

Здесь ниже есть упрощенная идея, но помните, что мой 0-матрица очень большая, и я не могу проверить, какие строки / столбцы отсутствуют.

4x4 Matrix
    1   2   3   4
1   0   0   0   0
2   0   0   0   0
3   0   0   0   0
4   0   0   0   0

3x3 matrix  
    1   2   4
1   1   4   7
2   2   5   8
4   3   6   9

4x4 solution matrix
    1   2   3   4
1   1   4   0   7
2   2   5   0   8
3   0   0   0   0
4   3   6   0   9

В примере вы можете увидеть, что матрица 3x3 пропускает третью строку / столбец.Отсутствует n-я строка - это то же самое, что и отсутствующий n-й столбец (симметричное несоответствие).

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Вот пошаговая обобщенная версия решения @ r2evans:

Создать нулевую матрицу желаемого размера "решения"

m1 <- matrix(0, 4, 4)

И, для этого примера, нам нужен пример матрицы данных

m2 <- matrix(1:9, 3, 3, dimnames=list(c(1,2,4), c(1,3,4)))
m2
#  1 3 4
#1 1 4 7
#2 2 5 8
#4 3 6 9

Используйте имена строк и столбцов, чтобы получить позиции, в которые нужно поместить m2 значения

location_mat <- cbind(
                  as.numeric(rep(rownames(m2), ncol(m2))), 
                  as.numeric(rep(colnames(m2), each=nrow(m2))) 
                  )

И, для ясности, поместите значения m2 в вектор

value_vec <- as.vector(m2)

Затем "заполните" нулевую матрицу значениями m2 в нужном месте на основе имен строк и столбцов m2 (именно здесь происходит вся магия)

m1[location_mat] <- value_vec

m1 теперь должна быть требуемая матрица

m1
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    4    7
#[2,]    2    0    5    8
#[3,]    0    0    0    0
#[4,]    3    0    6    9
0 голосов
/ 17 мая 2019

Относительно простое решение состоит в том, чтобы просто установить первую матрицу на заданную разницу между именами измерений первого и второго и назначить элементы второго соответствующим элементам первого (как предложено @ r2evans в его первом комментарии):

first[
  dimnames(first)[[1]] %in% dimnames(second)[[1]], 
  dimnames(first)[[2]] %in% dimnames(second)[[2]]
  ] <- second

# > first
#
#   1 2 3 4
# 1 1 4 0 7
# 2 2 5 0 8
# 3 0 0 0 0
# 4 3 6 0 9

Данные:

first <- structure(
  c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
  .Dim = c(4L, 4L),
  .Dimnames = list(
    c("1", "2", "3", "4"), 
    c("1", "2", "3", "4")
    )
)

second <- structure(
  1:9,
  .Dim = c(3L, 3L),
  .Dimnames = list(
    c("1", "2", "4"), 
    c("1", "2", "4")
    )
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...