如何生成圆形分割矩阵?

How to generate a matrix of circular-splits?

我沿着一个圆圈对人口进行了排序。设 Z 为我所有名为 "A".. "E".

的 5 个种群的排序
Z = c("A","B","C","D","E")

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

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

我如何在 R 中做到这一点?

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

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。