【问题标题】:Identifying similar items from a matrix in r从 r 中的矩阵中识别相似的项目
【发布时间】:2021-02-26 07:15:08
【问题描述】:

我有一个这样的矩阵:

a <- c(0,45,19,48,28,19,0,0,62,3,61,62,0,0,0,63,29,0,0,0,0,0,62,63,0,0,0,0,0,29,0,0,0,0,0,0)
mat1 <- matrix(a,6,6,byrow = TRUE)
mat1
> mat1
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0   45   19   48   28   19
[2,]    0    0   62    3   61   62
[3,]    0    0    0   63   29    0
[4,]    0    0    0    0   62   63
[5,]    0    0    0    0    0   29
[6,]    0    0    0    0    0    0

现在,如果任何单元格的值小于 30,则表示相应的行和列相同/相似。例如 [1,3] 是 19,因此我们说它们是相似的。

所以对于每一行,我们计算相似的组合(即单元格中少于 30 个)。

第 1 行:[1,3],[1,5],[1,6]

第 2 行:[2,4]

第 3 行:[3,6]

第 4 行:0

第 5 行:[5,6]

第 6 行:0

所以总的相似组合是[1,3]、[1,5]、[1,6]、[2,4]、[3,6]和[5,6]。结果应该显示没有传递项目的总相似组合,这意味着总相似项目应该只有 2 因为 [1,3] , [1,5] , [1,6] , [5,6],[3, 6] 是相同/相似的,所以这些的计数应该是 1,组合 [2,4] 应该是 1。因此,对于这个矩阵,总相同/相似是 2。

有多个 nxm 阶矩阵,因此所需的解决方案应该根据行数和列数是动态的。

【问题讨论】:

  • 我已多次阅读问题陈述,但无法弄清楚为什么 [1,3] 、 [1,5] 、 [1,6] 、 [5,6] 来自一个组和 [2,4] 在另一个组中,为什么没有提到 [3,6]。
  • 已添加 [3,6] 。之前错过了
  • 但是您仍然没有回答主要问题。
  • [1,3] , [1,5] , [1,6] , [5,6],[3,6] 都来自一个组,因为它们本质上是传递性的。假设 1==3 ,1==5 和 1==6 因此 3 将等于 6 而 5 将等于 6
  • 您使用“及物”这个词的方式似乎与我以前看到的不同。

标签: r


【解决方案1】:

这是一个igraph 选项,希望它适用于您的目的(我猜您正在寻找集群的数量)

library(igraph)

components(
  graph_from_data_frame(
    data.frame(which(mat1 != 0 & mat1 < 30, arr.ind = TRUE))
  )
)$no

给了

[1] 2

详情

  1. 为索引创建数据框
> data.frame(which(mat1 != 0 & mat1 < 30, arr.ind = TRUE))
  row col
1   1   3
2   2   4
3   1   5
4   3   5
5   1   6
6   5   6
  1. 构造图
g <- graph_from_data_frame(
  data.frame(which(mat1 != 0 & mat1 < 30, arr.ind = TRUE))
)
plot(g)

  1. 查看集群
> components(g)
$membership
1 2 3 5 4 6
1 2 1 1 2 1

$csize
[1] 4 2

$no
[1] 2

【讨论】:

    【解决方案2】:

    这将输出一个组合列表。

    x=data.table(which(mat1<30 & mat1>0,arr.ind=T))
    setkey(x,row)
    x=x[!(row==col)]
    
    s=list()
    for(j in unique(x$row)){
      s[j]=list(NULL)
      temp=x[row==j,col]
      for(i in temp){
        s[[j]]=cbind(s[[j]],c(j,i))
        for(k in x[row==i,col])
          if(k %in% c(temp,j)) s[[j]]=cbind(s[[j]],c(i,k))
        x=x[!(row==i & col %in% c(temp,j))]
    }}
    
    s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多