2015-02-25 4 views
1

У меня есть заказ популяций по кругу. Пусть Z - упорядочение всех моих 5 популяций под названием «A» .. «E».Как создать матрицу круговых разбиений?

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

Разделение - это одна возможность разделить все популяции на два набора, где каждый набор содержит по крайней мере одну совокупность. Разбивает, что положил D с одной стороны, а EABC с другой стороны называется Splits D|EABC. Я не хочу ничего менять между D|EABC и EABC|D. Раскол D|EABC представлен зеленой линией на рисунке ниже. Все приведенные ниже строки представляют все существующие расщепления.

Circular Splits of 5 populations

Моя цель состоит в том, чтобы создать все расколы можно и создать матрицу, которая говорит мне, является ли данная пара населения находится в том же наборе в обратном наборе, когда происходит данное разделение. Например, раскол AB | DCE поместил популяцию A и C на два разных набора, но не ставит A и B в двух разных наборах. Из вектора Z я стремлюсь построить следующий вид матрицы, где 1 указывает, что две популяции в одном наборе и 0 показывают, что две популяции являются различные наборы

Splits matrix (not complete)

Как может Я делаю это в R?

ответ

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.

Смежные вопросы