我有一个数据框,其中某些物种出现在哪些区域,其中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种物种的清单,我需要总结共享区域。
答案 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")
)。