【发布时间】:2021-03-24 10:33:54
【问题描述】:
就上下文而言,我正在尝试测试从社区中移除某些物种对多样性的影响是否与随机移除任何其他物种不同。这个想法是建立一个空模型,在该模型中,我将 df 中某些列中的值保持不变,并将其余部分随机更改为 0。在每一行中,我想将与我保持不变的列数相同的列数更改为 0,以便每行中的数据数等于一行中存在的总数减去每行中的列数。主要问题是每行中要更改为 0 的数据数量会发生变化,因此我必须一次执行一行。
到目前为止,我已经能够使用循环来完成它,但是它很慢,我必须这样做一千次,而且我的实际矩阵要大得多。 在以下示例中,假设我想保留列“V1”、“V7”、“V10”和“V12”:
set.seed(20)
library(picante)
phylo<-rtree(n = ncol(df), tip.label = colnames(df)) #This is needed later for the diversity index
df<-as.data.frame(matrix(data = sample(c(0,1), size = 10*20, replace = T),
nrow = 10, ncol = 20))
constant.sps<-c('V1', 'V7', 'V10', 'V12')
我创建用于分隔 dfs,一个包含我想要保留的列 (df1),另一个包含其余列 (df2)。然后根据df1计算我必须在df2中将多少列更改为0,随机选择每行中的那些列并更改它们。之后我加入了 df1 和随机 df 并计算了我需要的多样性度量。然后我必须再做 q 次才能获得每行的多样性度量的零分布。
df1<-df[, colnames(df) %in% constant.sps]
df2<-df[, !colnames(df) %in% constant.sps]
constant.n<-rowSums(df1)
runs<-10
results<-c()
for (q in 1:runs) {
temp<-df2
for (i in 1:dim(temp)[1]) {
temp[i,][sample(which(temp[i,] > 0), constant.n[i])]<-0
}
results[[q]]<-pd(cbind(df1, temp), phylo)[1]
}
这是超级慢且效率低下但我想不出其他方法,有没有人知道如何正确地做到这一点? 提前致谢
【问题讨论】: