【问题标题】:R combine rows of matrix if any element matches element of any other row如果任何元素与任何其他行的元素匹配,则R组合矩阵行
【发布时间】:2018-06-16 19:36:21
【问题描述】:

如果行中的至少一个值等于另一行中的值之一,我想将矩阵中的行组合成一个列表元素。并迭代地执行此行组合(所有行与所有其他行)。我很抱歉解释不好。一个澄清的例子:

mymatrix <- matrix(data = c(2, 3, 4, 22, 7, 11, 8, 13, 17, 19, 20,
                            4, 36, 8, 2, 29, 35, 40, 14, 21, 20, 21),
                   nrow = 11, ncol = 2)
row.names(mymatrix) <- c(3, 6, 7, 10, 12, 17, 18, 19, 24, 26, 28)

某个函数的结果应该是:

myresult <- list(c(2, 4, 4, 8, 22, 2, 8, 40),
                 c(3, 36),
                 c(7, 29),
                 c(11, 35),
                 c(13, 14),
                 c(17, 21, 20, 21, 19, 20))

因此,原始矩阵的第 1、3、4、7 行被合并(要清楚,行名为 3、7、10、18 的行),底部 3 行也是如此。

如果解决方案将删除每个列表元素中的重复项(和/或对整数进行排序)也很好,否则我会这样做。

在这种情况下,它看起来像这样:

myresult <- list(c(2, 4, 8, 22, 40),
                 c(3, 36),
                 c(7, 29),
                 c(11, 35),
                 c(13, 14),
                 c(17, 19, 20, 21))

也许我可以通过将矩阵与自身合并来实现这一点,但我不知道如何正确地做到这一点。感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个图聚类问题;您可以为此使用igraph 包:

    library(igraph)
    
    # change the vertice name type to character
    mode(mymatrix) <- 'character'
    
    # create the graph
    g <- graph_from_edgelist(mymatrix)
    
    # find out the cluster
    members <- clusters(g)$membership
    
    # split nodes by membership
    split(names(members), members)
    #$`1`
    #[1] "2"  "4"  "8"  "22" "40"
    
    #$`2`
    #[1] "3"  "36"
    
    #$`3`
    #[1] "7"  "29"
    
    #$`4`
    #[1] "11" "35"
    
    #$`5`
    #[1] "13" "14"
    
    #$`6`
    #[1] "17" "21" "19" "20"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 2016-07-24
      • 1970-01-01
      • 2013-04-11
      • 2022-01-09
      • 2017-01-24
      • 2015-01-24
      • 2015-10-26
      相关资源
      最近更新 更多