将表格汇总为矩阵

时间:2019-02-22 06:58:38

标签: r matrix

我有一个数据框,其中某些物种出现在哪些区域,其中1 =存在,0 =不存在。我想创建一个成对矩阵,将具有共享区域的物种数量相加。这是我的数据的示例:

我的数据:

structure(c(0.5, 0.3, 0.25, 0.5, 0.3, 0.25, 0, 0.3, 0.25, 0, 0, 0.25), .Dim = 3:4, 
          .Dimnames = list(c("Species1", "Species2", "Species3"), 
                           c("AreaA", "AreaB", "AreaC", "AreaD")))

         AreaA AreaB AreaC AreaD
Species1  0.5   0.5   0     0
Species2  0.3   0.3   0.3   0
Species3  0.25  0.25  0.25  0.25

最后我想要这样的东西:

      AreaA AreaB AreaC AreaD
AreaA     0   2.1   1.1   0.5
AreaB         0     1.1   0.5
AreaC               0     0.5
AreaD                     0

我有超过50,000种物种的清单,我需要总结共享区域。

1 个答案:

答案 0 :(得分:0)

编辑:

现在看来,您正在尝试对那些大于零的列的内容求和。这很令人困惑,因为问题的第一部分不再适用(0 =不存在,1 =存在)。因此,我在下面留下了您的原始数据和原始问题的解决方案。如果您明确说明了您真正想要的是什么,我也可以弄清楚答案。

您现在在问题中拥有的矩阵可以通过以下方式获取:

M <- structure(c(0.5, 0.3, 0.25, 0.5, 0.3, 0.25, 0, 0.3, 0.25, 0, 0, 0.25), .Dim = 3:4, 
          .Dimnames = list(c("Species1", "Species2", "Species3"), 
                           c("AreaA", "AreaB", "AreaC", "AreaD")))

Shared <- matrix(0, nrow = ncol(M), ncol = ncol(M))
rownames(Shared) <- colnames(M)
colnames(Shared) <- colnames(M)
for(i in 1:ncol(M)){
    Shared[i, -i] <- apply(M[, -i], 2, function(x){sum(pmin(M[, i] + x)[M[, i] > 0 & x > 0])})
}

> print(Shared)
      AreaA AreaB AreaC AreaD
AreaA   0.0   2.1   1.1   0.5
AreaB   2.1   0.0   1.1   0.5
AreaC   1.1   1.1   0.0   0.5
AreaD   0.5   0.5   0.5   0.0

旧答案

此解决方案总结了区域之间当前物种的数量:

M <- matrix(c(1,1,0,0,
              1,1,0,0,
              0,0,1,1), nrow = 3, byrow = TRUE)

colnames(M) <- paste0("Area", LETTERS[1:4])
rownames(M) <- paste0("Species", 1:3)

Shared <- matrix(0, nrow = ncol(M), ncol = ncol(M))
rownames(Shared) <- colnames(M)
colnames(Shared) <- colnames(M)
for(i in 1:ncol(M)){
  Shared[i, -i] <- apply(M[, -i], 2, function(x){sum(M[, i] == 1 & x == 1)})
}

如果只想显示上面的三角形,只需执行以下操作:

Shared[lower.tri(Shared)] <- '' # or NA if you want the numbers to stay numbers
print(Shared)

> print(Shared)
      AreaA AreaB AreaC AreaD
AreaA "0"   "2"   "0"   "0"  
AreaB ""    "0"   "0"   "0"  
AreaC ""    ""    "0"   "1"  
AreaD ""    ""    ""    "0"  

如果您只是想查找重叠度较大的区域,也可以直接使用距离函数(例如dist(t(M), method = "manhattan"))。