2015-08-31 46 views
2

說我有矩陣一個和兩個:驗證行和列的名稱是否相同中的R矩陣之間

> 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 

是否有能產生一個邏輯值的命令,以驗證是否的列和行的名稱矩陣一與矩陣二相同?

+0

如果答案下面已經爲之努力的一個你,請考慮點擊灰色的複選標記來接受它。 –

回答

4

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

+2

對於額外的upvotes,鏈接:'library(magrittr); list(1,2)%> lapply(dimnames)%>%Reduce(「identical」,。)' – Frank

+2

我不需要額外的upvotes,謝謝。 –

+0

那麼,至少它應該避開鏈第二個答案:) – Frank

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