несовместимые массивы: как добавить несколько матриц с различной длиной строки вместе? - PullRequest
0 голосов
/ 31 октября 2018

У меня 17 матриц с переменной длиной строки, однако у них у всех 6 одинаковых имен столбцов. Каждый элемент в матрице является количеством переходов. Я хотел бы сложить все свои матрицы вместе, чтобы получить общее количество каждого перехода.

Существует 36 возможных имен строк, поэтому я создал матрицу с именами строк всех возможных комбинаций, в которой есть элементы с нулем и 6 именами столбцов.

Идея состоит в том, чтобы добавить матрицу с нулевым элементом ко всем 17 матрицам, чтобы все они имели одинаковые имена строк. Следующим шагом будет добавление всех обновленных 17 матриц вместе.

Но когда я пытаюсь сложить матрицы вместе, я получаю эту ошибку:

Error in all.crossings + count.mat000102 : non-conformable arrays

Моя матрица с нулевым элементом отличается от остальных 17 матриц только количеством имен строк:

          k
ij        Aa A Baa Ba B Caa
 A-A      0  0   0  0 0   0
 A-Aa     0  0   0  0 0   0
 A-B      0  0   0  0 0   0
 A-Ba     0  0   0  0 0   0
 A-Baa    0  0   0  0 0   0
 A-Caa    0  0   0  0 0   0
 Aa-A     0  0   0  0 0   0
 Aa-Aa    0  0   0  0 0   0
 Aa-B     0  0   0  0 0   0
 Aa-Ba    0  0   0  0 0   0
 Aa-Baa   0  0   0  0 0   0
 Aa-Caa   0  0   0  0 0   0
 B-A      0  0   0  0 0   0
 B-Aa     0  0   0  0 0   0
 B-B      0  0   0  0 0   0
 B-Ba     0  0   0  0 0   0
 B-Baa    0  0   0  0 0   0
 B-Caa    0  0   0  0 0   0
 Ba-A     0  0   0  0 0   0
 Ba-Aa    0  0   0  0 0   0
 Ba-B     0  0   0  0 0   0
 Ba-Ba    0  0   0  0 0   0
 Ba-Baa   0  0   0  0 0   0
 Ba-Caa   0  0   0  0 0   0
 Baa-A    0  0   0  0 0   0
 Baa-Aa   0  0   0  0 0   0
 Baa-B    0  0   0  0 0   0
 Baa-Ba   0  0   0  0 0   0
 Baa-Baa  0  0   0  0 0   0
 Baa-Caa  0  0   0  0 0   0
 Caa-A    0  0   0  0 0   0
 Caa-Aa   0  0   0  0 0   0
 Caa-B    0  0   0  0 0   0
 Caa-Ba   0  0   0  0 0   0
 Caa-Baa  0  0   0  0 0   0
 Caa-Caa  0  0   0  0 0   0
attr(,"class")
[1] "matrix"
attr(,"call")
xtabs(formula = Count ~ ij + k, data = all.crossings) 

Пример одной из моих 17 матриц:

          k
ij        Aa A Baa Ba  B Caa
  A-A      0 0   0  2  0   0
  A-B      0 0   0  0  1   0
  A-Ba     0 0   0  0  2   0
  A-Baa    0 0   1  0  0   0
  B-A      0 1   0  0  0   0
  B-B      0 0   0  2 13   8
  B-Ba     0 0   1  4  6   3
  B-Baa    0 0   2  0  1   1
  B-Caa    0 0   0  0  5   7
  Ba-A     1 0   1  0  0   0
  Ba-B     0 0   1  4  6   4
  Ba-Ba    0 0   3  4  0   1
  Ba-Baa   0 0   0  2  0   0
  Ba-Caa   0 0   0  0  0   3
  Baa-Aa   0 0   0  1  0   0
  Baa-B    0 0   0  4  2   1
  Baa-Ba   1 1   0  0  2   1
  Baa-Baa  0 0   6  2  0   0
  Baa-Caa  0 0   0  1  1   0
  Caa-B    0 1   0  2  3   4
  Caa-Ba   0 0   0  1  2   1
  Caa-Caa  0 0   0  1 10  17
attr(,"class")
[1] "matrix"
attr(,"call")
xtabs(formula = Count ~ ij + k, data = count.mat000102)

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 31 октября 2018

Я бы предложил, чтобы для каждой матрицы вы делали все строки одинаковыми, то есть добавляли новые строки и заполняли 0. После этого сортируйте матрицы по именам строк.

Таким образом, вы можете сложить матрицы проще, просто Matrix1 + Matrix2 + Matrix3.

Как подсказывает ваш отредактированный ответ, я создал новую матрицу со всеми 0.

Matrix0

        Aa A Baa Ba B Caa
Aa-Aa    0 0   0  0 0   0
Aa-A     0 0   0  0 0   0
Aa-Baa   0 0   0  0 0   0
Aa-Ba    0 0   0  0 0   0
Aa-B     0 0   0  0 0   0
Aa-Caa   0 0   0  0 0   0
A-Aa     0 0   0  0 0   0
A-A      0 0   0  0 0   0
A-Baa    0 0   0  0 0   0
A-Ba     0 0   0  0 0   0
A-B      0 0   0  0 0   0
A-Caa    0 0   0  0 0   0
Baa-Aa   0 0   0  0 0   0
Baa-A    0 0   0  0 0   0
Baa-Baa  0 0   0  0 0   0
Baa-Ba   0 0   0  0 0   0
Baa-B    0 0   0  0 0   0
Baa-Caa  0 0   0  0 0   0
Ba-Aa    0 0   0  0 0   0
Ba-A     0 0   0  0 0   0
Ba-Baa   0 0   0  0 0   0
Ba-Ba    0 0   0  0 0   0
Ba-B     0 0   0  0 0   0
Ba-Caa   0 0   0  0 0   0
B-Aa     0 0   0  0 0   0
B-A      0 0   0  0 0   0
B-Baa    0 0   0  0 0   0
B-Ba     0 0   0  0 0   0
B-B      0 0   0  0 0   0
B-Caa    0 0   0  0 0   0
Caa-Aa   0 0   0  0 0   0
Caa-A    0 0   0  0 0   0
Caa-Baa  0 0   0  0 0   0
Caa-Ba   0 0   0  0 0   0
Caa-B    0 0   0  0 0   0
Caa-Caa  0 0   0  0 0   0

Для матрицы с неполным количеством строк, у меня это как

Matrix1

        Aa A Baa Ba  B Caa
A-A      0 0   0  2  0   0
A-B      0 0   0  0  1   0
A-Ba     0 0   0  0  2   0
A-Baa    0 0   1  0  0   0
B-A      0 1   0  0  0   0
B-B      0 0   0  2 13   8
B-Ba     0 0   1  4  6   3
B-Baa    0 0   2  0  1   1
B-Caa    0 0   0  0  5   7
Ba-A     1 0   1  0  0   0
Ba-B     0 0   1  4  6   4
Ba-Ba    0 0   3  4  0   1
Ba-Baa   0 0   0  2  0   0
Ba-Caa   0 0   0  0  0   3
Baa-Aa   0 0   0  1  0   0
Baa-B    0 0   0  4  2   1
Baa-Ba   1 1   0  0  2   1
Baa-Baa  0 0   6  2  0   0
Baa-Caa  0 0   0  1  1   0
Caa-B    0 1   0  2  3   4
Caa-Ba   0 0   0  1  2   1
Caa-Caa  0 0   0  1 10  17

Отсюда я могу связать строки Matrix1 со строками из Matrix0, которые еще не существуют в Matrix1.

Matrix1 <- rbind(Matrix1, Matrix0[!row.names(Matrix0) %in% row.names(Matrix1), ])

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

Matrix1 <- Matrix1[row.names(Matrix0), ]

Повторите эти две строки кодов для всех ваших 17 матриц, затем вы сможете их сложить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...