在R中工作,try 根据组(列)中的共享成员身份计算数据框(每行是一个项目)中的行之间的相似性/距离.然而,我不希望零值(即不是组中的成员)导致相似性.(我想要的有点像曼哈顿距离,但有不同的处理0‘S).

例如,对于此数据集:

Group1 Group2 Group3
0 0 0
1 0 0
0 1 0
0 0 1
1 1 0
1 0 1
0 1 1
1 1 1

我想要一个类似如下的相似性矩阵:

1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
0 1 0 0 1 1 0 1
0 0 1 0 1 0 1 1
0 0 0 1 0 1 1 1
0 1 1 0 2 1 1 2
0 1 0 1 1 2 1 2
0 0 1 1 1 1 2 2
0 1 1 1 2 2 2 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包中的一些函数,但似乎没有一个方法计算共享群的数量,而忽略共享群的缺席.

有谁有什么建议吗?我是不是简单地忽略了一个常见的内置距离方法?或者,有没有更快的方法来计算这种距离/相似性?

推荐答案

你可以简单地做一个tcross prod.IE as.matrix(df) %*% t(df)

tcrossprod(as.matrix(df))

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    0    0    0    0    0    0
[2,]    0    1    0    0    1    1    0    1
[3,]    0    0    1    0    1    0    1    1
[4,]    0    0    0    1    0    1    1    1
[5,]    0    1    1    0    2    1    1    2
[6,]    0    1    0    1    1    2    1    2
[7,]    0    0    1    1    1    1    2    2
[8,]    0    1    1    1    2    2    2    3
> 

R相关问答推荐

棒棒糖图表大小和线宽参数故障标签未出现

有没有方法将paste 0功能与列表结合起来?

提取R中值和列名的所有可能组合

删除facet_wrap标签之间的水平线

以R中的正确顺序将日期时间字符列转换为posixct

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

如何从R中的字符串元素中减go 一个数字?

使用case_match()和char数组重新编码值

如何在ggplot中标记qqplot上的点?

移除仪表板Quarto中顶盖和车身之间的白色区域

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

合并后返回列表的数据帧列表

如何根据R中其他变量的类别汇总值?

从R中发出的咕噜声中的BUG?

使用ifElse语句在ggploy中设置aes y值

网络抓取新闻标题和时间

如何在shiny 的应用程序 map 视图宣传单中可视化单点

将边列表转换为路径长度列表

网络抓取NBA.com

在R中使用ggraph包排列和着色圆