首页 > 解决方案 > 使用循环将较大维度矩阵转换为较小维度矩阵

问题描述

我目前有185*185 矩阵,目标是通过基于 185 矩阵的行和列聚合值来将此矩阵转换为35*35矩阵。

例子:

matrix_x <- matrix(1:64, nrow = 8)
matrix_y <- matrix(NA, nrow = 4, ncol = 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]]])

这种方法效果很好,但我正在寻找一种更有效的方法来实现这一点,因为我所做的方法需要很多代码行。

标签: rloopsmatrix

解决方案


应该有一种更简洁/更简单的方法来做到这一点,但这是一个直接的选择:

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

推荐阅读