比较两个矩阵的变化
Comparing changes across two matrices
我正在 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 或 C->B 的树中的节点编号。
所以我正在寻找的输出类似于:
> BC
[1] 1 3
> CB
[1] 2 4
会有 B>C 或 C>B 的行,但它们都不是行中最高的行 (node_5),我需要忽略这些行。然后使用行号查询提供我想要的数据的单独数据框。
我希望这一切都有意义。在此先感谢您的任何建议!
你可以这样做...
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
我正在 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 或 C->B 的树中的节点编号。
所以我正在寻找的输出类似于:
> BC
[1] 1 3
> CB
[1] 2 4
会有 B>C 或 C>B 的行,但它们都不是行中最高的行 (node_5),我需要忽略这些行。然后使用行号查询提供我想要的数据的单独数据框。
我希望这一切都有意义。在此先感谢您的任何建议!
你可以这样做...
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