Редактировать:
Теперь кажется, что вы пытаетесь суммировать содержимое столбцов, где эти столбцы больше нуля.Это сбивает с толку, потому что первая часть вашего вопроса больше не применяется (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")
).