说我有一个和两个矩阵:
> 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中的列名和行名相同?
答案 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