验证R中矩阵之间的行名和列名是否相同

时间:2015-08-31 15:16:56

标签: r matrix

说我有一个和两个矩阵:

    > one <- matrix(1:9, nrow=3, ncol=3, dimnames=list(c("X","Y","Z"), c("A", "B", "C")))
    > one
      A B C
    X 1 4 7
    Y 2 5 8
    Z 3 6 9
    > two <- matrix(1:9, nrow=3, ncol=3, dimnames=list(c("X","Y","Z"), c("WRONG", "B", "C")))
    > two
      WRONG B C
    X     1 4 7
    Y     2 5 8
    Z     3 6 9

是否有一个可以产生逻辑值的命令来验证矩阵1的列名和行名是否与矩阵2中的列名和行名相同?

2 个答案:

答案 0 :(得分:5)

您正在寻找identical()。对于行名称 -

identical(rownames(one), rownames(two))
# [1] TRUE

colnames()也一样。对于所有dimnames(),同样的事情 -

identical(dimnames(one), dimnames(two))
# [1] FALSE

同时对于行和列 -

Map(identical, dimnames(one), dimnames(two))
# [[1]]
# [1] TRUE
#
# [[2]]
# [1] FALSE

更新:针对您的评论,对于多个矩阵,您可以尝试

length(unique(lapply(list(one, two, three), dimnames))) == 1 

如果这返回FALSE,您就知道至少有一组dimnames不同。

答案 1 :(得分:1)

如果需要为每个行和列标识这一点,则可以执行此操作

cbind(unlist(dimnames(one)), unlist(dimnames(one)) %in% unlist(dimnames(two)))

#     [,1] [,2]   
#row1 "X"  "TRUE" 
#row2 "Y"  "TRUE" 
#row3 "Z"  "TRUE" 
#col1 "A"  "FALSE"
#col2 "B"  "TRUE" 
#col3 "C"  "TRUE" 

否则另一种选择是

do.call(`%in%`, list(dimnames(one), dimnames(two)))

#for row and column seperately
# [1]  TRUE FALSE