【发布时间】:2015-07-02 06:15:02
【问题描述】:
背景:
我目前正在使用功能多样性指数 FRis,其 R 脚本提供于:http://www.irstea.fr/la-recherche/unites-de-recherche/hyax/ecology-schleuter-2010
我在这个脚本运行错误时遇到了许多问题,我认为我已经找到了解决方案,但我是 R 的新手,无法修复这个最新的问题。
它涉及使用三个数据。每个栖息地类型的每种动物的数量,以及每个物种的性状的最大值和最小值,例如:
丰度1
Location S1 S2 S3 S4 S5 S6 S7 S8 S9
Palm 6 3 0 1 0 16 0 2 3
Forest 2 0 2 1 2 1 3 0 2
最大 1
Species max
S1 44.7344
S2 22.6966
S3 75.1817
S4 17.8176
S5 50.7472
S6 33.3660
S7 14.3341
S8 3.3947
S9 10.2510
分钟1
Species min
S1 25.3038
S2 19.5750
S3 60.5880
S4 16.2864
S5 46.1040
S6 10.9056
S7 8.7570
S8 2.1289
S9 4.1730
我做了什么:
脚本最初从我认为提取最小、最大和丰度数据并按物种排序的内容开始。
Abundance1 <- read.table("Put here your path/Sites.txt",h=T)
rownames(Abundance1) <- Abundance1[,1]
Abundance <- Abundance1[,-1]
Abundance <- Abundance[,order(colnames(Abundance))]
min1 <- read.table("Put here your path/min_traits.txt",h=T)
max1 <- read.table("Put here your path/max_traits.txt",h=T)
rownames(min1) <- min1[,1]
minsp <- min1[,-1]
minsp <- minsp[order(rownames(minsp)),]
rownames(max1) <- max1[,1]
maxsp <- max1[,-1]
maxsp <- maxsp[order(rownames(maxsp)),]
最初,maxsp 的最后一行返回一个错误,指出参数 (rownames(maxsp)) 不是向量,minsp 的最后一行也是如此。我意识到这可能是因为 rownames() 实际上是一个函数,所以我将那部分代码更改为 rownamesM 为最大值,rownamesm 为最小值。
在此之后它发回错误说 maxsp[order(rownamesM,] 的维数错误,minsp 也是如此。我认为这可能是因为提取函数正在减少维数所以我添加了drop = FALSE 对于每个提取结果,这让我得到了这个似乎有效的代码:
rownamesA <- Abundance1[,1, drop=FALSE]
Abundance <- Abundance1[,-1, drop=FALSE]
Abundance <- Abundance[order(colnames(Abundance))]
rownamesm <- min1[,1, drop=FALSE]
minsp <- min1[,-1, drop= FALSE]
minsp <- minsp[order(rownamesm),]
rownamesM <- max1[,1, drop=FALSE]
maxsp <- max1[,-1, drop=FALSE]
maxsp <- maxsp[order(rownamesM),]
但是我显然搞砸了,因为当我运行脚本的下一部分时,我收到一个错误,上面写着 Error in 1:ncol(minsp) : argument of length 0
下面是脚本的下一部分:
globalFRI <- function(minsp,maxsp) {
deltaS <- list()
for (j in 1:ncol(minsp))
{
xx <- cbind(minsp[,j], maxsp[,j])
xx <- xx[apply(xx,1,function(z) sum(is.finite(z))==2),]
xx <- xx[order(xx[,1]),]
z <- c(0, nrow(xx))
i <- 1
b <- xx[1, 2]
while ( i < nrow(xx) )
{
if (b < xx[i+1,1]) z <- c(z, i)
b <- ifelse(b >= xx[i+1,2], b, xx[i+1,2])
i <- i+1
if (i==nrow(xx)) break
}
group <- factor(rep(1:(length(z)-1), diff(sort(z))))
deltaS[[j]] <- tapply(xx[,2], group, max) - tapply(xx[,1], group, min)
}
globalFRIs <- sapply(deltaS, sum)}
globalFRIAll <- globalFRI(minsp,maxsp)
我完全不知所措,不知道下一步该做什么。谁能给我一些关于我哪里出错的指示?
提前致谢
【问题讨论】:
-
您需要掌握基本的调试技能。发生错误后,您的第一步应该是查看
ncol(minsp)。你的第二步,看minsp。
标签: r