R 匹配等于(对称或非对称矩阵)列名的行名

R 匹配等于(对称或非对称矩阵)列名的行名,r,matrix,R,Matrix,我正在对R中的距离矩阵进行统计分析,并想比较个体内部和群体之间的距离。我有一个矩阵,其中一些列名等于一些行名。我想提取满足此标准的值(问题是如何使其在非对称矩阵上工作)。如果代码可以保存一个矩阵,其中包含符合条件的逻辑值,那就太好了) 较小矩阵的示例如下所示: 1 2 3 4 1 0.4966143 0.8359290 0.7319204 0.7579902 3 0.7002979 0.8621343 0.5152356 0.7875

我正在对R中的距离矩阵进行统计分析,并想比较个体内部和群体之间的距离。我有一个矩阵,其中一些列名等于一些行名。我想提取满足此标准的值(问题是如何使其在非对称矩阵上工作)。如果代码可以保存一个矩阵,其中包含符合条件的逻辑值,那就太好了)

较小矩阵的示例如下所示:

       1         2         3         4
1 0.4966143 0.8359290 0.7319204 0.7579902
3 0.7002979 0.8621343 0.5152356 0.7875813
4 0.7406555 0.8371479 0.7103873 0.5530200
我希望它能像这样结束

       1         2         3         4
1    TRUE      FALSE     FALSE     FALSE
3   FALSE      FALSE     TRUE      FALSE
4   FALSE      FALSE     FALSE      TRUE

如果我可以不使用任何循环,只使用矢量化代码,我会很高兴。我们可以使用
outer

out <- outer(row.names(m1), colnames(m1), `==`)
dimnames(out) <- dimnames(m1)
out
#     1     2     3     4
#1  TRUE FALSE FALSE FALSE
#3 FALSE FALSE  TRUE FALSE
#4 FALSE FALSE FALSE  TRUE

注:正如@NelsonGon所建议的,当我们将数据(
read.table/read.csv
等)作为
data.frame
读取时,列名可以附加前缀
X
,因为它们是非规范名称,即以数字开头。要避免这种情况,请在
read.table/read.csv
中使用
check.names=FALSE
参数,或通过更改列名进行后期处理

outer(row.names(df), sub("^X","",names(df)),"==")
假设“df”是data.frame标识符对象

数据
m1
outer(row.names(df), sub("^X","",names(df)),"==")
m1 <- structure(list(`1` = c(0.4966143, 0.7002979, 0.7406555), 
                     `2` = c(0.835929,  0.8621343, 0.8371479), 
                     `3` = c(0.7319204, 0.5152356, 0.7103873), 
                     `4` = c(0.7579902, 0.7875813, 0.55302)), 
                class = "data.frame", 
                row.names = c("1", "3", "4"))