使用循环将较大尺寸的矩阵转换为较小尺寸的矩阵

时间:2020-02-17 04:51:17

标签: r loops matrix

我目前有 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矩阵cols聚合为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 个答案:

答案 0 :(得分:1)

应该有一种更整洁/更容易的方法,但这是一个简单的选择:

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