#APdobs_NTPD.fn函数:计算NTPD观察值,长度为focalsp的长度
setwd("C:/Users/Administrator/Desktop")
focalsp<-read.csv("x.csv",header=T,fileEncoding="GBK")##目标个体的种名
pdmatrix<-read.csv("juzhen.csv",header=T,fileEncoding="GBK")#系统发育距离矩阵
sample<-read.csv("x1.csv",header=T,fileEncoding="GBK")#周围邻体的其他种类
APdobs_NTPD.fn =function(focalsp,pdmatrix,sample)
#focalsp为目标个体的种名,pdmatrix为系统发育距离矩阵(标准化成0-1,参考Liza的课件),spinsample为周围邻体的其他种类
{
pdtofocal.min =numeric()
for(i in 1:length(focalsp))
{
spinsample=rownames(sample)[sample[,i]!=0]
spinsample.abund=sample[,i][sample[,i]!=0]
focalsp.pos=which(rownames(pdmatrix)==focalsp[i])
spinsample.pos=match(spinsample,colnames(pdmatrix))
pdtofocal=numeric()
for(j in 1:length(spinsample.pos))
{
pdtofocal[j]=pdmatrix[focalsp.pos,spinsample.pos[j]]
}
pdtofocal.min[i]=min(pdtofocal)
}
return(pdtofocal.min)
}
##APdobs.fn函数:计算null model 平均值
APdobs.fun=function(focalsp,pdmatrix,sample)#focalsp为目标个体的种名,pdmatrix为系统发育距离矩阵(标准化成0-1,参考Liza的课件),spinsample为周围邻体的其他种类
{
pdtofocal.mean.all=numeric()
for(i in 1:length(focalsp))
{
spinsample=rownames(sample)[sample[,i]!=0]
spinsample.abund=sample[,i][sample[,i]!=0]
focalsp.pos=which(rownames(pdmatrix)==focalsp[i])
spinsample.pos=match(spinsample,colnames(pdmatrix))
pdtofocal=numeric()
for(j in 1:length(spinsample.pos))
{
pdtofocal[j]=pdmatrix[focalsp.pos,spinsample.pos[j]]*spinsample.abund[j]
}
h<-which(names(spinsample.abund)==focalsp[i])
if (length(h)>0){
focal.abund=spinsample.abund[h]
pdtofocal.mean=sum(pdtofocal)/(sum(spinsample.abund)-focal.abund) }
if(length(h)==0){
pdtofocal.mean=sum(pdtofocal)/sum(spinsample.abund) }
pdtofocal.mean.all[i]=pdtofocal.mean
}
return(pdtofocal.mean.all)
}
results <- APdobs.fun(focalsp,pdmatrix,sample)
write.table(results, "APdobs.fun")
报错
Error in pdmatrix[focalsp.pos, spinsample.pos[j]] * spinsample.abund[j] :
non-numeric argument to binary operator
不知道你这个问题是否已经解决, 如果还没有解决的话: