如何生成圆形分裂矩阵?

时间:2015-02-25 00:32:15

标签: r split

我按顺序排列了一群人。设Z是我所有5个人口的排序,名为" A" .." E"。

Z = c("A","B","C","D","E")

分裂是将所有种群分成两组的一种可能性,其中每组包含至少一个种群。将D放在一边而EABC放在另一边的分裂被称为Splits D|EABC。我不想在D|EABCEABC|D之间做出任何不同。分割D|EABC由下图中的绿线表示。下面的所有行代表所有现有的分割。

Circular Splits of 5 populations

我的目标是生成所有可能的分割并建立一个矩阵,告诉我当给定分割发生时,是否在相反的集合中找到给定的一对群体。例如,将AB | DCE分组AC放在两个不同的集上,但不将AB放在两个不同的集合中。从向量Z,我的目标是构建以下类型的矩阵,其中1表示两个群体在同一个集合中,0表示两个群体不同集

Splits matrix (not complete)

我怎么能在R?中做到这一点?

1 个答案:

答案 0 :(得分:1)

这些都是十个分裂及其补充:

first <- sapply(1:10, function(n) 
          LETTERS[1:5][combn(1:5,2)[1,n]:(combn(1:5,2)[2,n]-.1) ] )
comps <- sapply(first , function(f) setdiff( LETTERS[1:5] , f)  )

这是十对:

> pairings <- sapply(1:10, function(n) LETTERS[1:5][c(combn(1:5,2)[1,n], combn(1:5,2)[2,n]) ] )
> pairings
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "a"  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"  "d"  
[2,] "b"  "c"  "d"  "e"  "c"  "d"  "e"  "d"  "e"  "e"  

这应该提供矩阵:

outer(1:10, 1:10 , FUN= Vectorize( function(x,y){   # Either:
            (pairings[1,x] %in% first[[y]] & pairings[2,x] %in% comps[[y]] ) |  # Or
            (pairings[2,x] %in% first[[y]] & pairings[1,x] %in% comps[[y]] ) }))

       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
 [1,]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [2,]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
 [3,]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE
 [4,]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 [5,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
 [6,] FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
 [7,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [8,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE
 [9,] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
[10,] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE

如果需要将R逻辑矩阵矩阵化为1/0,只需将0添加到其中即可。