Сравнение изменений по двум матрицам

Я выполняю некоторые биогеографические анализы в R, и результат кодируется как пара матриц. Столбцы представляют географические регионы, строки указывают узлы в филогенетическом дереве, а значения в матрице представляют собой вероятность того, что событие ветвления произошло в географическом регионе, указанном в столбце. Очень простой пример:

> One_node<-matrix(c(0,0.8,0.2,0),
+                nrow=1, ncol=4,
+                dimnames = list(c("node 1"),
+                                c("A","B","C","D")))
> One_node
       A  B   C  D
node_1 0 0.8 0.2 0

В этом случае наиболее вероятным местоположением node_1 является регион B. На самом деле результат анализа кодируется в виде двух отдельных матриц 79x123. Первая — это вероятности того, что узел займет данную область до события, а вторая — это вероятности того, что узел займет данную область после события (rowSums=1). Несколько более сложных примеров:

before<-matrix(c(0,0,0,0,0.9,
                 0.8,0.2,0.6,0.4,0.07,
                 0.2,0.8,0.4,0.6,0.03,
                 0,0,0,0,0),
                 nrow=5, ncol=4,
                 dimnames = list(c("node_1","node_2","node_3","node_4","node_5"),
                                 c("A","B","C","D")))

after<-matrix(c(0,0,0,0,0.9,
                0.2,0.8,0.4,0.6,0.03,
                0.8,0.2,0.6,0.4,0.07,
                0,0,0,0,0),
                nrow=5, ncol=4,
                dimnames = list(c("node_1","node_2","node_3","node_4","node_5"),
                              c("A","B","C","D")))

> before
         A    B    C D
node_1 0.0 0.80 0.20 0
node_2 0.0 0.20 0.80 0
node_3 0.0 0.60 0.40 0
node_4 0.0 0.40 0.60 0
node_5 0.9 0.07 0.03 0
> after
         A    B    C D
node_1 0.0 0.20 0.80 0
node_2 0.0 0.80 0.20 0
node_3 0.0 0.40 0.60 0
node_4 0.0 0.60 0.40 0
node_5 0.9 0.03 0.07 0

В частности, меня интересует только извлечение номеров строк, где столбец B является самым высоким в before, а столбец C является самым высоким в after, и наоборот, поскольку я пытаюсь извлечь номера узлов в дереве, где таксоны переместились B- > C или С->Б.

Итак, результат, который я ищу, будет примерно таким:

> BC
[1] 1 3
> CB
[1] 2 4

Будут строки, в которых B>C или C>B, но ни одна из них не будет самой высокой в ​​строке (node_5), и мне нужно их игнорировать. Затем номера строк используются для запроса отдельного фрейма данных, который предоставляет нужные мне данные.

Я надеюсь, что все это имеет смысл. Заранее благодарю за любой совет!


person JimmyK    schedule 19.09.2017    source источник


Ответы (1)


Вы могли бы сделать что-то вроде этого...

maxBefore <- apply(before, 1, which.max) #find highest columns before (by row)
maxAfter <- apply(after, 1, which.max) #and highest columns after

BC <- which(maxBefore==2 & maxAfter==3) #rows with B highest before, C after
CB <- which(maxBefore==3 & maxAfter==2) #rows with C highest before, B after

BC
node_1 node_3 
     1      3 
CB
node_2 node_4 
     2      4 
person Andrew Gustar    schedule 19.09.2017
comment
Отлично, это делает именно то, о чем я просил, но только что показало мне, что я на самом деле не очень понимаю свою проблему! Спасибо! - person JimmyK; 20.09.2017