У меня есть разреженная матрица присутствия и отсутствия видов на многих участках, т.е. матрица участков по матрице видов. У меня также есть другая таблица видов, сгруппированных в кластеры.
Я хотел бы иметь новую матрицу (также матрицу участков x видов), которая фиксирует количество каждого вида в кластере.
У меня есть для l oop, который может выполнять эту работу, но моя исходная матрица очень большая, состоящая из нескольких тысяч строк и столбцов, и для l oop будет дорого в вычислительном отношении. Есть идеи, как добиться этого, используя матричную алгебру или что-то более элегантное?
Мой набор данных организован следующим образом:
# 1. Species grouped in clusters
memb <- c(1,2,3,4,2,5)
names(memb) <- c("s1", "s2", "s3", "s4", "s5", "s6")
# 2. Number of clusters
z <- length(unique(memb))
z
[1] 5
# 3. Community matrix of species presence-absence across sites
d <- data.frame(grids=c("v1", "v1", "v2", "v2", "v3", "v3", "v3",
"v1", "v3", "v4", "v2", "v1", "v4", "v3"),
sp=c("s1", "s3", "s2", "s3", "s1", "s2", "s3",
"s4", "s4", "s4", "s5", "s6", "s5", "s5"))
M <- as.data.frame.matrix(table(d$grids, d$sp))
library(Matrix)
M <- Matrix(as.matrix(M), sparse=TRUE)
M
4 x 6 sparse Matrix of class "dgCMatrix"
s1 s2 s3 s4 s5 s6
v1 1 . 1 1 . 1
v2 . 1 1 . 1 .
v3 1 1 1 1 1 .
v4 . . . 1 1 .
# 4. create empty matrix collapsed proportional to the original diversity.
cluster_comm <- Matrix(0, dim(M)[[1]], z)
tmp_comm <- Matrix(0, dim(M)[[1]], dim(M)[[2]])
rownames(cluster_comm) <- rownames(M)
rownames(tmp_comm) <- rownames(M)
colnames(tmp_comm) <- names(memb)[order(memb, decreasing = FALSE)]
colnames(cluster_comm) <- colnames(M)[1:z]
# 5. For loop to add species to reduced empty matrix based on group membership
for (m in 1:dim(M)[[1]]) {
tmp_comm[m, ] <- as.numeric(M[m, names(memb)[order(memb,decreasing = FALSE)]])
for (i in 1:z) {
names <- names(memb)[memb == i]
cluster_comm[m, i] <- sum(tmp_comm[m, names])
colnames(cluster_comm)[i] <- names[[1]]
}
}
# Expected outcome
cluster_comm
4 x 5 sparse Matrix of class "dgCMatrix"
s1 s2 s3 s4 s6
v1 1 . 1 1 1
v2 . 2 1 . .
v3 1 2 1 1 .
v4 . 1 . 1 .