在R中合并多时间点二分网络矩阵的行与列名
合并多个二分网络矩阵并统一维度
核心思路
先提取所有矩阵的行、列名并取排序后的并集,创建对应维度的空矩阵(填充指定默认值),再逐个将原矩阵的数值映射到新矩阵的对应位置。
示例代码实现
# 示例数据 adj1 <- matrix(0, 3, 5) colnames(adj1) <- c("g1", "g2", "g3", "g5", "g6") rownames(adj1) <- c("Tim", "John", "Sarah") adj2 <- matrix(0, 4, 2) colnames(adj2) <- c("g1", "g4") rownames(adj2) <- c("Tim", "Mary", "John", "Paolo") # 1. 获取所有行、列名的排序并集 all_rows <- sort(unique(c(rownames(adj1), rownames(adj2)))) all_cols <- sort(unique(c(colnames(adj1), colnames(adj2)))) # 2. 创建目标矩阵,填充默认值(这里用NA,换成10只需把NA改为10) combined_adj <- matrix(NA, nrow = length(all_rows), ncol = length(all_cols)) rownames(combined_adj) <- all_rows colnames(combined_adj) <- all_cols # 3. 填充第一个矩阵的数据 combined_adj[rownames(adj1), colnames(adj1)] <- adj1 # 4. 填充第二个矩阵的数据 combined_adj[rownames(adj2), colnames(adj2)] <- adj2 # 查看最终结果 combined_adj
扩展到多个矩阵的批量处理
如果有更多矩阵(比如统一存放在列表mat_list中),可以用循环批量完成:
# 假设所有待合并矩阵都放在这个列表里 mat_list <- list(adj1, adj2) # 获取所有行、列名的排序并集 all_rows <- sort(unique(unlist(lapply(mat_list, rownames)))) all_cols <- sort(unique(unlist(lapply(mat_list, colnames)))) # 创建目标矩阵 combined_adj <- matrix(NA, nrow = length(all_rows), ncol = length(all_cols)) rownames(combined_adj) <- all_rows colnames(combined_adj) <- all_cols # 批量填充所有矩阵的数据 for(mat in mat_list) { combined_adj[rownames(mat), colnames(mat)] <- mat }
关键说明
- 默认值可按需替换:把
matrix(NA, ...)中的NA改成10即可满足填充10的需求。 - 行列名自动按字母顺序排序,完全匹配你的要求。
- 原矩阵的数值会精准映射到新矩阵的对应位置,未被原矩阵覆盖的区域保留设定的默认值。
内容的提问来源于stack exchange,提问作者SteffenT
相关产品推荐
相关产品推荐

