【问题标题】:Verify whether row and column names are the same between matrices in R验证R中矩阵之间的行名和列名是否相同
【发布时间】:2015-08-31 15:16:56
【问题描述】:

假设我有矩阵一和二:

    > 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

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

【问题讨论】:

  • 如果以下答案之一对您有用,请考虑单击灰色复选标记以接受它。

标签: r matrix


【解决方案1】:

您正在寻找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 是不同的。

【讨论】:

  • 对于额外的支持,链接:library(magrittr); list(one,two) %&gt;% lapply(dimnames) %&gt;% Reduce("identical",.)
  • 好吧,至少它应该用链子来避免第二个答案:)
  • 感谢您的反馈。如果我想比较两个以上的矩阵,有没有比两个比较两个更简单的方法?
  • @E.Mun - 我认为length(unique(lapply(list(one, two, three), dimnames))) == 1 可以解决这个问题。如果是FALSE你就知道至少有一组dimnames是不同的
【解决方案2】:

如果需要为每一行和每一列识别这个,你可以这样做

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  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2021-04-29
    相关资源
    最近更新 更多