r - 如果任何元素与任何其他行的元素匹配,则R组合矩阵行
问题描述
如果行中的至少一个值等于另一行中的值之一,我想将矩阵中的行组合成一个列表元素。并迭代地执行此行组合(所有行与所有其他行)。我很抱歉解释不好。一个例子来澄清:
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))
也许我可以通过将矩阵与自身合并来实现这一点,但我不知道如何正确地做到这一点。帮助表示赞赏!
解决方案
这是一个图聚类问题;您可以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"
推荐阅读
- linux - 如何将文件的行随机插入另一个文本文件?
- vb.net - TableLayoutPanel 右对齐文本不打印
- javascript - 在三角形边框中使用液体效果制作蛇效果
- typescript - 将类型指定为与新属性合并的接口?
- python-3.x - 在python中实现一个观察者类
- javascript - 更改视图时不遵守完整的日历事件显示
- java - TESR 不渲染颜色,纹理偏移
- python - 如何从python中的列表中获取唯一值
- rsocket - 为什么在已连接的套接字上订阅 RSocket connectionStatus() 会导致两个回调调用?
- mysql - 从 STATION 表中选择以元音开头和结尾的城市名称