为列表中的矩阵补全行以实现行数统一并按count列排序
统一矩阵行数并补全缺失行的向量化解决方案
需求概述
现有一批列名相同但行数不同的矩阵,所有矩阵均包含count列,需要完成以下处理:
- 将所有矩阵统一为固定行数(count列取值为0到8,共9行)
- 按count列的连续递增顺序排列行
- 缺失的count值对应的行,插入以该count值开头、后续8列均为0的行
- 所有矩阵存储在普通列表中,需采用向量化方式处理整个列表,避免使用for循环,无需预先指定维度参数
示例矩阵
原始矩阵
# 第一个矩阵 count 0 1 2 3 4 5 6 7 [1,] 0 0 2 0 1 0 0 0 0 [2,] 1 1 1 4 0 1 0 1 0 [3,] 2 1 1 2 0 2 0 1 2 [4,] 3 0 1 0 0 0 0 0 0 [5,] 4 0 0 0 4 0 0 0 0 [6,] 5 0 0 0 0 0 3 0 0 [7,] 8 0 0 0 0 0 1 0 0 # 第二个矩阵 count 0 1 2 3 4 5 6 7 [1,] 0 0 2 0 1 0 0 0 0 [2,] 1 1 1 4 0 1 0 1 0 [3,] 2 1 1 2 0 2 0 1 2 [4,] 3 0 1 0 0 0 0 0 0 [5,] 4 0 0 0 4 0 0 0 0 [6,] 7 0 0 0 0 0 3 0 0
调整后矩阵
# 第一个矩阵调整后 count 0 1 2 3 4 5 6 7 [1,] 0 0 2 0 1 0 0 0 0 [2,] 1 1 1 4 0 1 0 1 0 [3,] 2 1 1 2 0 2 0 1 2 [4,] 3 0 1 0 0 0 0 0 0 [5,] 4 0 0 0 4 0 0 0 0 [6,] 5 0 0 0 0 0 3 0 0 [7,] 6 0 0 0 0 0 0 0 0 # 插入的缺失行 [8,] 7 0 0 0 0 0 0 0 0 # 插入的缺失行 [9,] 8 0 0 0 0 0 1 0 0 # 第二个矩阵调整后 count 0 1 2 3 4 5 6 7 [1,] 0 0 2 0 1 0 0 0 0 [2,] 1 1 1 4 0 1 0 1 0 [3,] 2 1 1 2 0 2 0 1 2 [4,] 3 0 1 0 0 0 0 0 0 [5,] 4 0 0 0 4 0 0 0 0 [6,] 5 0 0 0 0 0 0 0 0 # 插入的缺失行 [7,] 6 0 0 0 0 0 0 0 0 # 插入的缺失行 [8,] 7 0 0 0 0 0 3 0 0 [9,] 8 0 0 0 0 0 0 0 0 # 插入的缺失行
示例列表生成代码
your_list <- list( matrix(c(0,1,2,3,4,5,8,0,1,1,0,0,0,0,2,1,1,1,0,0,0,0,4,2,0,0,0,0,1,0,0,0,4,0,0,0,1,2,0,0,0,0,0,0,0,0,0,3,1,0,1,1,0,0,0,0,0,0,2,0,0,0,0), nrow=7,ncol=9,dimnames=(list(character(0),c("count",0:7)))), matrix(c(0,1,2,3,4,7,0,1,1,0,0,0,2,1,1,1,0,0,0,4,2,0,0,0,1,0,0,0,4,0,0,1,2,0,0,0,0,0,0,0,0,3,0,1,1,0,0,0,0,0,2,0,0,0), nrow=6,ncol=9,dimnames=(list(character(0),c("count",0:7)))), matrix(c(0,1,2,3,4,5,6,7,8,0,1,0,0,1,0,0,0,0,2,1,1,1,0,0,0,0,0,4,2,0,0,0,0,0,0,1,0,0,0,0,0,4,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,1,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0), nrow=9,ncol=9,dimnames=(list(character(0),c("count",0:7)))), matrix(c(0,1,2,3,4,5,6,7,8,0,1,0,0,1,0,0,0,0,2,1,1,1,0,0,0,0,0,4,2,0,0,0,0,0,0,1,0,0,0,0,0,4,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,1,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0), nrow=9,ncol=9,dimnames=(list(character(0),c("count",0:7)))) )
向量化解决方案
使用purrr包的map()函数实现列表的向量化遍历处理,无需for循环:
library(purrr) # 定义单个矩阵的处理函数 process_matrix <- function(mat) { # 构建完整的count序列(0到8) full_counts <- 0:8 # 获取当前矩阵已有的count值 existing_counts <- mat[, "count"] # 找出缺失的count值 missing_counts <- setdiff(full_counts, existing_counts) # 生成缺失行的矩阵:count为缺失值,其余列填充0 missing_rows <- matrix( data = c(missing_counts, rep(0, length(missing_counts)*8)), nrow = length(missing_counts), ncol = ncol(mat), dimnames = list(NULL, colnames(mat)) ) # 合并已有行和缺失行,按count排序 combined_mat <- rbind(mat, missing_rows) sorted_mat <- combined_mat[order(combined_mat[, "count"]), ] # 重置行名(可选,使输出更整洁) rownames(sorted_mat) <- NULL return(sorted_mat) } # 处理整个矩阵列表 adjusted_list <- map(your_list, process_matrix)
方案说明
process_matrix函数负责单个矩阵的补全与排序:先确定完整的count范围,识别缺失值,生成对应填充行,合并后按count排序。purrr::map()自动遍历列表中的每个矩阵,应用处理函数,最终返回调整后的矩阵列表,完全符合需求:无需预先指定维度,保持普通列表结构,避免for循环。
内容的提问来源于stack exchange,提问作者lamhine
相关产品推荐
相关产品推荐

