我按顺序排列了一群人。设Z是我所有5个人口的排序,名为" A" .." E"。
Z = c("A","B","C","D","E")
分裂是将所有种群分成两组的一种可能性,其中每组包含至少一个种群。将D放在一边而EABC放在另一边的分裂被称为Splits D|EABC
。我不想在D|EABC
和EABC|D
之间做出任何不同。分割D|EABC
由下图中的绿线表示。下面的所有行代表所有现有的分割。
我的目标是生成所有可能的分割并建立一个矩阵,告诉我当给定分割发生时,是否在相反的集合中找到给定的一对群体。例如,将AB | DCE
分组A
和C
放在两个不同的集上,但不将A
和B
放在两个不同的集合中。从向量Z
,我的目标是构建以下类型的矩阵,其中1
表示两个群体在同一个集合中,0
表示两个群体不同集
我怎么能在R?中做到这一点?
答案 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添加到其中即可。