r - 使用循环将较大维度矩阵转换为较小维度矩阵
问题描述
我目前有185*185 矩阵,目标是通过基于 185 矩阵的行和列聚合值来将此矩阵转换为35*35矩阵。
例子:
- 我有一个 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]]])
这种方法效果很好,但我正在寻找一种更有效的方法来实现这一点,因为我所做的方法需要很多代码行。
解决方案
应该有一种更简洁/更简单的方法来做到这一点,但这是一个直接的选择:
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]))))
推荐阅读
- java - 什么是 android.uid.system: 1000 为什么会显示?
- kubernetes-helm - 在 skaffold.yml 中基于平台设置主机环境变量
- sql - 为什么这个 PostgreSQL 查询会导致 0 个结果,即使我知道有
- python-3.x - 使用时间序列制作群体图
- javascript - HTMLAudioElement 和授权
- html - React 中的锚点
- c# - C# DateTime 如何确定现在和今天的时间
- excel - 如何通过VBA在excel中创建具有特殊格式的字符串列表
- postgresql - 如何对搜索结果进行分页?
- javascript - Jquery在数据表上使用ajax渲染Json内容