我不确定用这种方式表达的最佳方法,也许我的目标比我要实现的目标容易。我正在尝试比较两个同时出现的矩阵(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中按行匹配物种组合来计算呢?
答案 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