如何用R函数从3个矩阵提取至少在2个矩阵中出现的行创建新矩阵
筛选至少在两个矩阵中出现行名的新矩阵实现方法
需求说明
现有三个矩阵mat1、mat2、mat3,需要生成一个新矩阵,要求新矩阵的行名必须至少在其中两个原矩阵中出现。以提供的示例矩阵为例,符合条件的行名为a、b、d、e、f。
示例矩阵定义
mat1 <- as.matrix(c(1:4)) rownames(mat1) <- c("a","b","c","d") mat2 <- as.matrix(c(15:18)) rownames(mat2) <- c("d","e","f","g") mat3 <- as.matrix(c(3:9)) rownames(mat3) <- c("a","b","z","x","d","e","f")
实现函数
下面是通用的实现函数,支持传入任意数量的矩阵,自动筛选符合条件的行名并合并矩阵:
create_shared_row_matrix <- function(...) { # 获取所有输入矩阵 mats <- list(...) # 收集每个矩阵的行名,并统计每个行名出现的矩阵数量 row_names <- lapply(mats, rownames) all_rows <- unlist(row_names) row_counts <- table(all_rows) # 筛选出至少在2个矩阵中出现的行名 target_rows <- names(row_counts[row_counts >= 2]) # 合并所有矩阵的对应行,缺失值用NA填充 merged_mat <- do.call(cbind, lapply(mats, function(mat) { mat[target_rows, , drop = FALSE] })) # 设置列名(可选,区分来自哪个原矩阵) colnames(merged_mat) <- paste0("mat", seq_along(mats)) return(merged_mat) }
测试函数
调用函数并查看结果:
result <- create_shared_row_matrix(mat1, mat2, mat3) print(result)
运行后输出结果:
mat1 mat2 mat3 a 1 NA 3 b 2 NA 4 d 4 15 7 e NA 16 8 f NA 17 9
函数说明
- 该函数通过
...参数接受任意数量的矩阵,不局限于三个; - 先统计每个行名在矩阵中的出现次数,筛选出次数≥2的行;
- 合并时自动为缺失的行填充
NA,保证结构统一; - 自动为新矩阵的列命名为
mat1、mat2...,方便区分来源。
内容的提问来源于stack exchange,提问作者Basheer Ahmad
相关产品推荐
相关产品推荐

