如果任何元素与任何其他行的元素匹配,则R组合矩阵行

时间:2018-06-16 19:36:21

标签: r

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

typology

某些功能的结果应该是:

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)

因此原始矩阵的行1,3,4,7被组合(显然,具有rownames 3,7,10,18的行),以及最后3行。

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

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

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 个答案:

答案 0 :(得分:0)

这是图簇问题;您可以使用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"