如何基于相似非等价矩阵对R语言中矩阵的行进行排序?
调整R语言矩阵B的行顺序以匹配矩阵A的行元素集合
现有两个维度相同的矩阵A和B,二者第一列完全相同,元素集合一致但行列分布不同——即B中每行的元素和A中某一行的元素完全一样,但列位置可能不同,且当前行顺序不对应。需要调整B的行顺序,保持每行内元素的列位置不变,让B的每行与A对应行的元素集合完全一致。
示例代码
A = matrix(c(1, 0, 0 , 0 , 0, 1, 0 ,0 , 0 , 2, 1 , 0 ,0 , 0 , 3, 1 , 0 , 0, 0 , 4, 1 , 0 , 0 , 0, 5, 1, 0 , 0 , 2 , 3, 1, 0, 0 , 2 , 4, 1, 0 , 0 ,2 , 5, 1, 0 , 0 ,3, 4, 1 , 0 , 0, 3 , 5, 1 , 0 , 0 , 4 , 5, 1 , 0 ,2 , 3, 4, 1 , 0 , 2 , 3 , 5, 1 , 0 , 2 ,4 , 5, 1 , 0 , 3 , 4 , 5, 1 , 2, 3 ,4, 5), nrow=16, byrow=TRUE) B = matrix(c(1 , 0 ,0, 0 , 0, 1, 0 , 0, 0 , 5, 1, 0 , 0, 4 , 0, 1 , 0 , 0 , 4 , 5, 1 , 0 , 3 , 0 , 0, 1 , 0 , 3, 0 , 5, 1 , 0 , 3 , 4 , 0, 1 ,0 , 3 , 4, 5, 1 , 2, 0 , 0 , 0, 1 , 2 , 0, 0 , 5, 1, 2 , 0 , 4 , 0, 1 , 2 ,0 , 4 ,5, 1 , 2 , 3 , 0 , 0, 1 , 2 , 3 ,0 , 5, 1 , 2 , 3 ,4 , 0, 1 ,2, 3 ,4, 5), nrow=16, byrow=TRUE)
矩阵输出
矩阵A
> A [,1] [,2] [,3] [,4] [,5] [1,] 1 0 0 0 0 [2,] 1 0 0 0 2 [3,] 1 0 0 0 3 [4,] 1 0 0 0 4 [5,] 1 0 0 0 5 [6,] 1 0 0 2 3 [7,] 1 0 0 2 4 [8,] 1 0 0 2 5 [9,] 1 0 0 3 4 [10,] 1 0 0 3 5 [11,] 1 0 0 4 5 [12,] 1 0 2 3 4 [13,] 1 0 2 3 5 [14,] 1 0 2 4 5 [15,] 1 0 3 4 5 [16,] 1 2 3 4 5
矩阵B
> B [,1] [,2] [,3] [,4] [,5] [1,] 1 0 0 0 0 [2,] 1 0 0 0 5 [3,] 1 0 0 4 0 [4,] 1 0 0 4 5 [5,] 1 0 3 0 0 [6,] 1 0 3 0 5 [7,] 1 0 3 4 0 [8,] 1 0 3 4 5 [9,] 1 2 0 0 0 [10,] 1 2 0 0 5 [11,] 1 2 0 4 0 [12,] 1 2 0 4 5 [13,] 1 2 3 0 0 [14,] 1 2 3 0 5 [15,] 1 2 3 4 0 [16,] 1 2 3 4 5
解决方案
核心思路是为每行生成唯一的元素集合标识:将每行元素排序后拼接成字符串,这样不管元素在列中的位置如何,相同元素集合的行都会有完全一致的标识。随后根据A的标识匹配B中对应的行,重新排列B的行顺序。
实现代码
# 定义函数:为矩阵每行生成排序后的字符串标识 get_row_key <- function(mat) { apply(mat, 1, function(row) paste(sort(row), collapse = ",")) } # 生成A和B的行标识 a_keys <- get_row_key(A) b_keys <- get_row_key(B) # 根据A的标识匹配B的行,重新排列B B_reordered <- B[match(a_keys, b_keys), ] # 验证结果:检查所有行的元素集合是否匹配 all(apply(A, 1, function(x) sort(x)) == apply(B_reordered, 1, function(x) sort(x)))
代码说明
get_row_key函数:对每行元素排序后用逗号拼接成字符串,确保相同元素集合的行有统一的key。match(a_keys, b_keys):找到B中每个A行标识对应的行索引,以此索引重新排列B的行。- 最后一行代码用于验证结果,返回
TRUE则说明所有行的元素集合已完全匹配。
内容的提问来源于stack exchange,提问作者Ly T
相关产品推荐
相关产品推荐

