比较同现矩阵

时间:2019-06-06 19:09:12

标签: r dplyr lookup binary-data

我不确定用这种方式表达的最佳方法,也许我的目标比我要实现的目标容易。我正在尝试比较两个同时出现的矩阵(MatA和MatB),这些矩阵具有以行为单位的站点,以每个站点以列的形式出现的物种,即1 =存在和0 =不存在。这是一些较小的伪装数据:

>MatA
        G. magnirostris  G. fortis  G. fuliginosa G. difficilis
Site1        0           0              1            1 
Site2        1           0              1            1
Site3        0           1              1            0

>MatB 
           G. magnirostris  G. fortis   G. fuliginosa   G. difficilis
Jefferson    1               1           0               0 
Hillsdale    0               1           1               1

对于MatB中的每一行(站点),我想搜索MatA中的每一行(站点),并首先计算同时发生的物种数量,如果可能的话,还要追踪哪些物种。因此,对于杰斐逊遗址,在MatA中,从来没有发生过物种G. magnirostris和G. fortis的组合。因此结果= 0。 对于希尔斯代尔(Hillsdale),这3个物种(G. fuliginosa,G。fortis和G. difficilis)不会像这3个物种一样出现,但是有两种组合可以做到:  G. fortis和G. fuliginosa,然后是G. fuliginosa和G. difficilis。

我应该提到,我有数百个列(种类)和数千行(站点)。我尝试使用MatA%*%t(MatB)作为入门的矩阵乘法,但是它错误为不合格,我也不认为这就是我想要的。关于如何设置此设置的任何建议将非常有帮助。一直为此苦苦挣扎!

编辑:我编码了MatA的成对共现概率矩阵(MatA.probs)。我现在要计算MatB中每行(站点)的物种匹配的组合概率。例如:

>MatA.prob
                G. magnirostris   G. fortis    G. fuliginosa  G. difficilis
G. magnirostris       NA          0                 1           1
G. fortis             0          NA                 1           2
G. fuliginosa         1          1                  NA          2
G. difficilis         1          0                  2           NA

然后给出,由于从未发生过该组合在杰斐逊中的组合概率将为= 0,但在希尔斯代尔,对于三种可能的组合中的每一个,其组合概率为1 * 0 * 2。我该如何在MatB中按行匹配物种组合来计算呢?

1 个答案:

答案 0 :(得分:0)

我意识到您不必计算所有组合, 这是解决原始问题的一种方法, 其中每一行都是MatB中出现的MatA(或其子集)的样本:

library(dplyr)

ans <- apply(MatB, 1L, function(r) {
  matching_names <- colnames(MatA)[r == 1L]
  nonmatching_names <- setdiff(colnames(MatA), matching_names)

  MatA %>%
    filter_at(vars(!!nonmatching_names), all_vars(. == 0L)) %>%
    filter_at(vars(!!matching_names), any_vars(. == 1L)) %>%
    mutate(site_total = nrow(.))
}) %>%
  bind_rows(.id = "site")
       site G.magnirostris G.fortis G.fuliginosa G.difficilis site_total
1 Hillsdale              0        0            1            1          2
2 Hillsdale              0        1            1            0          2