Преобразуйте матрицу большего размера в матрицу меньшего размера с помощью цикла - PullRequest
1 голос
/ 17 февраля 2020

В настоящее время у меня есть 185 * 185 матрица , и цель состоит в том, чтобы преобразовать эту матрицу в 35 * 35 матрицу путем агрегирования значения на основе строк и столбцов матрицы 185 .

Пример:

  • У меня матрица 8 * 8, как показано ниже:
matrix_x <- matrix(1:64, nrow = 8)
  • Затем я хочу преобразовать ее в матрица 4 * 4:
matrix_y <- matrix(NA, nrow = 4, ncol = 4)
  • Приведенный ниже список создан для агрегирования столбцов матрицы 8 * 8 в матрицу 4 * 4
col_list <- list(
  1,
  2:3,
  c(4,8),
  5:7
)
  • Что я сделал, чтобы добиться этого, так это присвоив значение вручную, как показано ниже
matrix_y[1,1] <- sum(matrix_x[col_list[[1]],col_list[[1]]])
matrix_y[1,2] <- sum(matrix_x[col_list[[1]],col_list[[2]]])
matrix_y[1,3] <- sum(matrix_x[col_list[[1]],col_list[[3]]])
matrix_y[1,4] <- sum(matrix_x[col_list[[1]],col_list[[4]]])

matrix_y[2,1] <- sum(matrix_x[col_list[[2]],col_list[[1]]])
matrix_y[2,2] <- sum(matrix_x[col_list[[2]],col_list[[2]]])
matrix_y[2,3] <- sum(matrix_x[col_list[[2]],col_list[[3]]])
matrix_y[2,4] <- sum(matrix_x[col_list[[2]],col_list[[4]]])

matrix_y[3,1] <- sum(matrix_x[col_list[[3]],col_list[[1]]])
matrix_y[3,2] <- sum(matrix_x[col_list[[3]],col_list[[2]]])
matrix_y[3,3] <- sum(matrix_x[col_list[[3]],col_list[[3]]])
matrix_y[3,4] <- sum(matrix_x[col_list[[3]],col_list[[4]]])

matrix_y[4,1] <- sum(matrix_x[col_list[[4]],col_list[[1]]])
matrix_y[4,2] <- sum(matrix_x[col_list[[4]],col_list[[2]]])
matrix_y[4,3] <- sum(matrix_x[col_list[[4]],col_list[[3]]])
matrix_y[4,4] <- sum(matrix_x[col_list[[4]],col_list[[4]]])

Этот подход работает хорошо, но я ищу более эффективный способ достижения так как подход, который я использовал, занимает так много строк кода.

1 Ответ

1 голос
/ 17 февраля 2020

Должен быть более простой и удобный способ сделать это, но есть один простой способ:

n <- 4
t(sapply(seq_len(n), function(p) sapply(col_list, function(q) sum(matrix_x[p, q]))))

#     [,1] [,2] [,3] [,4]
#[1,]    1   26   82  123
#[2,]    2   28   84  126
#[3,]    3   30   86  129
#[4,]    4   32   88  132

Это дает ту же матрицу, что и matrix_y в посте.


Для обновленного вопроса мы можем использовать outer

apply_fun <- function(x, y) sum(matrix_x[x, y])
outer(col_list, col_list, Vectorize(apply_fun))

#     [,1] [,2] [,3] [,4]
#[1,]    1   26   82  123
#[2,]    5   58  170  255
#[3,]   12   72  184  276
#[4,]   18  108  276  414

или следуя тому же подходу, что и в исходном ответе с вложенным sapply

t(sapply(col_list, function(p) sapply(col_list, function(q) sum(matrix_x[p, q]))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...