验证R中的矩阵之间的行名和列名是否相同
假设我有矩阵1和矩阵2:验证R中的矩阵之间的行名和列名是否相同,r,matrix,R,Matrix,假设我有矩阵1和矩阵2: > 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("
> 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
>一个一个
A、B、C
X 14 7
Y 2 5 8
Z369
>二二
错误的B C
X 14 7
Y 2 5 8
Z369
是否有一个命令可以生成逻辑值来验证矩阵1的列名和行名是否与矩阵2中的列名和行名相同?您要查找的是
idential()
。对于行名称-
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
是不同的。如果需要为每一行和每一列标识此项,您可以这样做
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
对于额外的向上投票,链接:
库(magrittr);列出(一,两个)%%>%lappy(dimnames)%%>%Reduce(“相同的”,)
好吧,至少它应该避免第二个答案,用链子:)谢谢你的反馈。如果我想比较两个以上的矩阵,有没有比两个一个比较更简单的方法?@E.Mun-我认为length(unique(lappy(list(one,two,three),dimnames))==1就可以了。如果是<代码> false <代码>,你知道至少有一组<代码> DimNexs/Cuff>对下面的一个答案有不同之处,请考虑点击灰色复选标记来接受它。