如何在R中编写函数按行名匹配矩阵行并生成新矩阵
矩阵行名匹配并生成新矩阵的R函数实现
核心思路
提取矩阵A的所有行名,在矩阵B中匹配这些行名,将匹配到的B对应行与A合并,生成保留行名的两列新矩阵C。
代码实现
先模拟带行名的测试数据(方便验证效果):
# 生成测试矩阵,固定随机种子保证结果可复现 set.seed(123) A <- matrix(rnorm(100), nrow = 100, ncol = 1, dimnames = list(paste0("row", 1:100), "A_value")) B <- matrix(rnorm(4000), nrow = 4000, ncol = 1, dimnames = list(paste0("row", sample(1:5000, 4000)), "B_value"))
然后编写匹配函数:
match_matrix_rows <- function(mat_A, mat_B) { # 提取矩阵A的行名 a_rows <- rownames(mat_A) # 定位A行名在B行名中的位置(不存在的行名对应NA) b_match_pos <- match(a_rows, rownames(mat_B)) # 提取B中匹配到的行,drop=FALSE确保结果保持矩阵格式 matched_b <- mat_B[b_match_pos, , drop = FALSE] # 合并A与匹配后的B,设置列名 result_mat <- cbind(mat_A, matched_b) colnames(result_mat) <- c("A_value", "B_value") return(result_mat) }
使用示例
# 调用函数生成矩阵C C <- match_matrix_rows(A, B) # 查看前5行结果 head(C)
可选优化
如果需要过滤掉B中不存在的行(即移除含NA的行),可以给函数添加过滤逻辑:
match_matrix_rows <- function(mat_A, mat_B, remove_na = FALSE) { a_rows <- rownames(mat_A) b_match_pos <- match(a_rows, rownames(mat_B)) matched_b <- mat_B[b_match_pos, , drop = FALSE] result_mat <- cbind(mat_A, matched_b) colnames(result_mat) <- c("A_value", "B_value") if (remove_na) { result_mat <- result_mat[!is.na(result_mat[, "B_value"]), , drop = FALSE] } return(result_mat) } # 调用时开启过滤 C_clean <- match_matrix_rows(A, B, remove_na = TRUE)
内容的提问来源于stack exchange,提问作者Rana Jawad
相关产品推荐
相关产品推荐

