如何用R语言找出矩阵中与另一矩阵行完全匹配的行号?
在R中找出矩阵mat1与mat2行完全匹配的行号
现有两个矩阵mat1和mat2,已知mat2的所有行都存在于mat1中,需求是找出mat1中所有与mat2行完全匹配的行的行号。以下是示例数据:
mat1 <- matrix(c(0,0,0,1,1,1,1,1,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0), 8, 3) mat2 <- matrix(c(0,0,1,1,0,1,0,1,1,0,1,1), 4, 3) # 查看mat1 mat1 # [,1] [,2] [,3] # [1,] 0 0 0 # [2,] 0 0 1 # [3,] 0 1 0 # [4,] 1 0 1 # [5,] 0 1 0 # [6,] 1 0 0 # [7,] 1 1 1 # [8,] 1 1 0 # 查看mat2 mat2 # [,1] [,2] [,3] # [1,] 0 0 1 # [2,] 0 1 0 # [3,] 1 0 1 # [4,] 1 1 1
方法一:Base R字符串拼接法
将矩阵的每行元素拼接成唯一字符串,通过集合匹配快速定位行号,适合中小规模矩阵:
# 将每行转为以逗号分隔的字符串 mat1_rows <- apply(mat1, 1, paste, collapse = ",") mat2_rows <- apply(mat2, 1, paste, collapse = ",") # 找出所有匹配的行号 match_rows <- which(mat1_rows %in% mat2_rows) match_rows # 输出:[1] 2 3 5 4 7
方法二:dplyr半连接法
借助tidyverse工具集,将矩阵转为数据框后用半连接筛选匹配行,语法更直观:
library(dplyr) # 转换为数据框并保留行号 mat1_df <- as.data.frame(mat1) %>% mutate(row_num = row_number()) mat2_df <- as.data.frame(mat2) # 半连接提取匹配行的行号 match_rows <- mat1_df %>% semi_join(mat2_df, by = colnames(mat2_df)) %>% pull(row_num) match_rows # 输出:[1] 2 3 5 4 7
方法三:Base R合并法
利用merge函数匹配所有列相同的行,适合习惯原生R函数的用户:
# 为矩阵添加行号列 mat1_with_row <- cbind(mat1, row_num = 1:nrow(mat1)) mat2_with_row <- cbind(mat2, dummy = 1:nrow(mat2)) # 添加临时列避免合并冲突 # 合并矩阵并提取行号,最后排序 merged <- merge(mat1_with_row, mat2_with_row, by = colnames(mat1)) match_rows <- sort(merged$row_num) match_rows # 输出:[1] 2 3 4 5 7
注:示例中mat1的第3、5行均与mat2的第二行完全匹配,因此结果包含这两个行号。
内容的提问来源于stack exchange,提问作者user20536224
相关产品推荐
相关产品推荐

