如何生成圆形分割矩阵?
How to generate a matrix of circular-splits?
我沿着一个圆圈对人口进行了排序。设 Z 为我所有名为 "A".. "E".
的 5 个种群的排序
Z = c("A","B","C","D","E")
拆分是一种将所有种群分成两组的可能性,其中每组至少包含一个种群。将 D 放在一侧而 EABC 放在另一侧的拆分称为拆分 D|EABC
。我不想在 D|EABC
和 EABC|D
之间做出任何区别。拆分D|EABC
在下图中用绿线表示。下面的所有行代表所有现有的拆分。
我的目标是生成所有可能的分裂,并建立一个矩阵,告诉我当给定分裂发生时,是否在同一组或相反组中找到给定的人口对。例如 split AB | DCE
将 population A
和 C
放在两个不同的集合中,但不会将 A
和 B
放在两个不同的集合中。从向量 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。
我沿着一个圆圈对人口进行了排序。设 Z 为我所有名为 "A".. "E".
的 5 个种群的排序Z = c("A","B","C","D","E")
拆分是一种将所有种群分成两组的可能性,其中每组至少包含一个种群。将 D 放在一侧而 EABC 放在另一侧的拆分称为拆分 D|EABC
。我不想在 D|EABC
和 EABC|D
之间做出任何区别。拆分D|EABC
在下图中用绿线表示。下面的所有行代表所有现有的拆分。
我的目标是生成所有可能的分裂,并建立一个矩阵,告诉我当给定分裂发生时,是否在同一组或相反组中找到给定的人口对。例如 split AB | DCE
将 population A
和 C
放在两个不同的集合中,但不会将 A
和 B
放在两个不同的集合中。从向量 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。