在R工作尝试根据组(列)中的共享成员关系来计算data.frame中的行(每行是一个项目)彼此之间的相似性/距离。但是,我不想要0值(即不是组中的成员)以促成相似性。(我想要的是曼哈顿距离,但对0的处理不同)。
例如,对于此数据集:
| 组2|第三组| Group3 |
| --|--| ------------ |
| 0| 0| 0 |
| 0| 0| 0 |
| 1| 0| 0 |
| 0| 1| 1 |
| 1| 0| 0 |
| 0| 1| 1 |
| 1| 1| 1 |
| 1| 1| 1 |
我想要一个类似于这样的相似度矩阵:
| 二个|三个|四|五|六|七|八| 8 |
| --|--|--|--|--|--|--| ------------ |
| 0| 0| 0| 0| 0| 0| 0| 0 |
| 1| 0| 0| 1| 1| 0| 1| 1 |
| 0| 1| 0| 1| 0| 1| 1| 1 |
| 0| 0| 1| 0| 1| 1| 1| 1 |
| 1| 1| 0|二个|1| 1|二个| 2 |
| 1| 0| 1| 1|二个|1|二个| 2 |
| 0| 1| 1| 1| 1|二个|二个| 2 |
| 1| 1| 1|二个|二个|二个|三个| 3 |
请注意,对角线值对于我的下游应用程序并不特别重要,因此给予与此相同输出但具有不同对角线的替代方法对我来说是一个很好的解决方案。
给定第一个矩阵,可以计算第二个相似度矩阵的一些非常非常慢的代码是:
calc_simil <- function(x) {
out <- matrix(nrow = nrow(x), ncol = nrow(x))
combos <- expand.grid(1:nrow(x), 1:nrow(x))
for (myrow in 1:nrow(combos)) {
temp <- x[c(combos[myrow, 1], combos[myrow, 2]), ]
out[combos[myrow, 1], combos[myrow, 2]] <-
out[combos[myrow, 2], combos[myrow, 1]] <-
sum((1-apply(temp, function(x) {any(x == 0)}, MARGIN = 2)) *
(1 - abs(temp[1, ] - temp[2, ])))
}
return(out)
}
字符串
我知道一定有更有效的方法来做到这一点,可能使用一些矩阵乘法的魔法,但我想不出来。我还研究了各种计算距离的内置方法,包括R包中的一些函数,但似乎没有一个在忽略组中的共享缺席的情况下计算共享组的数量。
有人有什么建议吗?我是否忽略了一个常见的内置距离方法?或者有没有更快的方法来计算这个距离/相似度?
1条答案
按热度按时间rxztt3cl1#
您可以简单地执行tcrossprod。即
as.matrix(df) %*% t(df)
字符串