我正在对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
如果我能做到没有任何循环,只需向量化的代码
答案 0 :(得分:3)
我们可以使用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
或者rep
将行名和列名相切以使length
相等,然后执行==
`dim<-`(row.names(m1)[row(m1)] == colnames(m1)[col(m1)], dim(m1))
注意:正如@NelsonGon所建议的那样,当我们以read.table/read.csv
的形式读取数据(data.frame
等)时,列名可以附加前缀X
,因为它们是非规范的名称,即以数字开头。为了避免这种情况,请在check.names = FALSE
中使用read.table/read.csv
参数,或者通过更改列名进行后续处理
outer(row.names(df), sub("^X","",names(df)),"==")
假设“ df”是data.frame标识符对象
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"))