【问题标题】:Convert bigger dimension matrix to smaller dimension matrix with a loop使用循环将较大维度矩阵转换为较小维度矩阵
【发布时间】:2020-02-17 04:51:17
【问题描述】:

我目前有 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":"36"?为什么不1:36col_list 应该做什么?后退一步,构建一个minimal的例子可能会有所帮助;尝试给出一个输入较小的示例matrix(您目前似乎没有包含任何示例数据)。
  • 您好,感谢您的评论。我已经更新了这个问题,所以希望你能理解我想要做什么。我引用了这些序列,因为如果我不这样做,它会返回错误的计算,因为它会忽略一个全为零的列

标签: r loops matrix


【解决方案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]))))

【讨论】:

  • 您好 Ronak,谢谢您的回答。但是很抱歉我举了一个错误的例子,它应该是 sum(matrix_x[col_list[[1]],col_list[[1]]]) 而不是 sum(matrix_x[1,col_list[[1]]])
  • @doo 更新了答案,可以查看最后一部分。
  • outer 的好解决方案,喜欢它!我也在写outer,但是看到你的已经在那里了,所以删除了我的:)
猜你喜欢
  • 2013-04-28
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多