根据阈值覆盖范围删除矩阵行,并使用r中的另一个矩阵

时间:2018-07-16 15:46:07

标签: r

我有一个matrix,由地点和物种组成。有些物种具有一定的性状价值,但不是全部。 我只想保留包含足够特征信息的站点种类matrix行,以我为例,这些行超过60%。

到目前为止,我拥有以下for-loop,但我希望此代码的版本更快。如何优化此设置并跳过for-loop部分?

# site-species matrix
A <- matrix(c(0, 0.2, 0.2, 0.6, 0.3, 0.3, 0, 0.4), byrow = T, nrow = 2)
colnames(A) <- paste0("sp_", seq(ncol(A)))
rownames(A) <- paste0("site_", seq(nrow(A)))
# trait information
B <- data.frame(sp = paste0("sp_", seq(1:ncol(A))),
                value = c(NA, NA, 2, 3))
# For-loop to get the coverage percentage for each row
pcover <- c()
for(i in 1:nrow(A)){
  non_null_A <- A[i, ][A[i, ] > 0]
  B_match <- match(names(non_null_A), B[, "sp"])
  B_value <- B[B_match, "value"]
  pcover <- rbind(pcover,
                  sum(!is.na(B_value)) / length(B_value) * 100)
}
A
A[pcover > 60, , drop = FALSE] # in this case, the second site is removed

1 个答案:

答案 0 :(得分:0)

想法是您需要同时满足两个条件:

  • A是肯定的吗?
  • B$value NA吗?

我们从一开始就计算这些测试,并且仅使用矢量化代码:

Apos <- A[,B$sp] > 0 # or just A>0 here but I assumed from your code that you'd needed this
pcover <- 100* colSums(t(Apos) & !is.na(B$value)) /rowSums(Apos) 
pcover
# site_1   site_2 
# 66.66667 33.33333

A[pcover > 60, , drop = FALSE] 
#        sp_1 sp_2 sp_3 sp_4
# site_1    0  0.2  0.2  0.6