当前位置:  开发笔记 > 编程语言 > 正文

相互测试所有值,并从结果矩阵中形成组

如何解决《相互测试所有值,并从结果矩阵中形成组》经验,为你挑选了1个好方法。

我觉得好像在问错误的问题,并试图重新发明轮子.我错过了什么?

我有一堆值,比方说8,我需要互相测试.我已经构建了一个函数,该函数返回一个矩阵,说明是否有任何两个值都在一个组中.由于缺乏更好的想法,让我在这里粘贴输出:

    data.text <- 
"1     2     3     4     5     6     7     8
1  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
2  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
3  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
4 FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
5 FALSE FALSE FALSE FALSE  TRUE  TRUE    NA FALSE
6 FALSE FALSE FALSE FALSE  TRUE  TRUE    NA FALSE
7 FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
8 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE"

data <- read.table(text=data.text, header = TRUE)
data <- as.matrix(data)
colnames(data) <- 1:8

因此,第1行表示值1与自身组(第1列),值为2和3,但值不是4 - 8.值5和6也在同一组内.

我正在尝试使用此信息来创建单个组ID以及该组中所有元素的向量:

第1组:1,2,3

第2组:5,6

到目前为止我做了什么:

# row and column index for all TRUE values by row
groups <- which(data,arr.ind = T)

# sort each row in acending order in order to find duplicate values
groups.sorted  <- t(apply(groups,1,sort))

# drop double statments ("1 and 2", "2 and 1")
groups.unique <- unique(groups.sorted)

# drop obivous information ("1 and 1")
groups.real <- groups.unique[groups.unique[,1] != groups.unique[,2],]

此时我被困住了.如何自动化第1,2和3行属于同一组的事实?

总而言之,我觉得我很笨拙地走这条路.任何人都能指出我更优雅的方式吗?



1> nicola..:

我会使用这个igraph包来做这类事情:

require(igraph)
components(graph_from_adjacency_matrix(data))$membership
#1 2 3 4 5 6 7 8 
#1 1 1 2 3 3 4 5

您将获得一个命名向量,其名称是元素,值是它们所属的组.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有