基于缺失唯一ID为矩阵匹配/添加含10值的行(R语言)
解决方案:统一面板波次邻接矩阵的行结构
核心思路
- 提取所有波次中出现的唯一ID,作为所有矩阵的统一行索引
- 将每个波次的邻接矩阵转换为数据框,与全ID框架合并,缺失行填充指定值(此处为10)
- 按ID排序后转回矩阵,保留原列名
可复现代码实现
# 原始输入数据 wave1 <- matrix(c(0,0,1,1,0,1,1,0,1,1), nrow = 5, ncol = 2, dimnames = list(c("1","2","4","5","9"), c("group1","group2"))) wave2 <- matrix(c(0,1,1,0,1,0,1,1), nrow = 4, ncol = 2, dimnames = list(c("1","4","8","9"), c("group1","group2"))) # 1. 获取所有波次的唯一ID并排序 all_ids <- sort(unique(c(rownames(wave1), rownames(wave2)))) # 2. 定义标准化矩阵的函数 standardize_matrix <- function(mat, all_ids, fill_val = 10) { # 矩阵转数据框,保留行名为ID列 df <- as.data.frame(mat) df$id <- rownames(df) # 合并到全ID框架,填充缺失值 full_df <- merge(data.frame(id = all_ids), df, by = "id", all.x = TRUE) full_df[is.na(full_df)] <- fill_val # 按ID排序后转回矩阵 full_df <- full_df[order(full_df$id), ] mat_out <- as.matrix(full_df[, -1]) rownames(mat_out) <- full_df$id colnames(mat_out) <- colnames(mat) return(mat_out) } # 3. 处理两个波次的矩阵 wave1_c <- standardize_matrix(wave1, all_ids) wave2_c <- standardize_matrix(wave2, all_ids) # 查看结果 wave1_c wave2_c
结果说明
运行代码后生成的wave1_c和wave2_c完全匹配预期效果:
- 所有矩阵统一为6行,行索引按唯一ID排序
- 原始矩阵中未出现的ID(如wave1中的"8"、wave2中的"2""5")对应的整行填充为10
- 原有ID的行保留原始数值,列名保持不变
内容的提问来源于stack exchange,提问作者SteffenT
相关产品推荐
相关产品推荐

