2016-05-12 26 views
0

我的目标识别数据帧的行是要在R.R:连接在由分担值在两列中

两列之间基于共享值的单个数据帧在本例中内识别“连接”的行,有是由与每个唯一片段相对应的整数标识的10个唯一片段(即,数据簇)。每行表示已经确定在彼此的特定距离阈值内的两个段。列“segA”和“segB”之间没有明显的区别,它们仅用于跟踪连接的段对。 “dist”列表示该对段之间的距离,但在这一点上并不真正需要,因为数据帧仅包含那些被认为“连接”的段对。

我试图找出一种方法来识别所有在“segA”或“segB”中具有至少一个共享值的行,这表示行之间的连接段。我最初的尝试对于循环和逻辑语句(我是R编程新手)而言已经过分复杂,所以我会非常感谢任何简洁的解决方案!

实施例:

df = data.frame(
    segA = c(1, 1, 2, 4, 6, 7, 9), 
    segB = c(2, 3, 4, 5, 8, 8, 10), 
    dist = c(0.5321, 0.3212, 0.4351, 0.1421, 0.5125, 0.1692, 0.3218) 
) 

df 
    segA segB dist 
1 1 2 0.5321 
2 1 3 0.3212 
3 2 4 0.4351 
4 4 5 0.1421 
5 6 8 0.5125 
6 7 8 0.1692 
7 9 10 0.3218 

行1和2被连接,因为它们都包含段 “1”。

行3和1被连接,因为它们都包含段“2”,等等

即使行2和3不被共享段的存在直接连接,它们被连接时,整体,由通过第1行

它们的相互连接的所需的最终输出将是这样的:

(1) = 1, 2, 3, 4, 5 
(2) = 6, 7, 8 
(3) = 9, 10 

,其中(1),(2)和(3)代表的不同整体段和它们的部件,其是直接/相互连接。

+0

看样子你有一个连接的网络问题。我从来没有使用它,但也许igraph软件包或类似的东西会有用。 – Dave2e

+0

有时候知道问题的名称是战斗的一半。谢谢你。 – Gerald

回答

0
## helper function for merging vector elements of a list 
merge.elems <- function(x,i,j) { 
    c(
     x[seq_len(i-1L)], ## before i 
     list(unique(c(x[[i]],x[[j]]))), ## combined i,j 
     x[seq_len(j-i-1L)+i], ## between i,j 
     x[seq_len(length(x)-j)+j] ## after j 
    ); 
}; ## end merge.elems() 

## initialize row groups and value groups 
rgs <- as.list(seq_len(nrow(df))); 
vgs <- do.call(Map,c(c,unname(df[1:2]))); 

## if there are 2 or more groups, exhaustively merge overlapping value group pairs 
if (length(rgs)>1L) { 
    i <- 1L; 
    j <- 2L; 
    repeat { 
     if (any(vgs[[i]]%in%vgs[[j]])) { 
      rgs <- merge.elems(rgs,i,j); 
      vgs <- merge.elems(vgs,i,j); 
      j <- i+1L; 
      if (j>length(rgs)) break; 
     } else { 
      j <- j+1L; 
      if (j>length(rgs)) { 
       i <- i+1L; 
       if (i==length(rgs)) break; 
       j <- i+1L; 
      }; ## end if 
     }; ## end if 
    }; ## end repeat 
}; ## end if 

## results 
rgs; 
## [[1]] 
## [1] 1 2 3 4 
## 
## [[2]] 
## [1] 5 6 
## 
## [[3]] 
## [1] 7 
## 
vgs; 
## [[1]] 
## [1] 1 2 3 4 5 
## 
## [[2]] 
## [1] 6 8 7 
## 
## [[3]] 
## [1] 9 10 
##