0

我正在制作一个循环来计算三列:最小值、最大值和几个图的测量平均值。我正在处理数千个地块的几个测量值的森林清单。我想要做的是计算每个物种(总共 153 个物种)在不同物种之间的特定地块的基底面积(测量值)的最小值、最大值和平均值。

首先,对于每个物种,我必须从 purs 80 中选择所有符合标准的地块(地块是 purs== 至少 80% 的地块仅由一个物种组成)。

head(purs80[,1:10])
        02         03 04 05 06 07 08S  09       10 11
27    0.000000   0.000000  0  0  0  0   0   0  0.00000  0
41    0.000000   0.000000  0  0  0  0   0   0  0.00000  0
47    6.369376   8.824162  0  0  0  0   0   0 84.80646  0
54    0.000000 100.000000  0  0  0  0   0   0  0.00000  0
83  100.000000   0.000000  0  0  0  0   0   0  0.00000  0
101   0.000000   0.000000  0  0  0  0   0 100  0.00000  0



#list of all the purs plots by species
  listplotspur80<-apply(purs80, 2,function(v) which(v > 80))

这是有效的。Listplotspur 是一个包含 153 个元素的列表,每个元素由满足标准的地块数量组成。只是头部的一个摘要它以及最后一个元素。

  head(summary( listplotspur80))
  Length Class    Mode     
02 "1422" "-none-" "numeric"
03 "1479" "-none-" "numeric"
04 "  50" "-none-" "numeric"
05 "1836" "-none-" "numeric"
06 " 689" "-none-" "numeric"
07 "  51" "-none-" "numeric"

因此,您可以看到列表中每个元素的元素数量不同。

> listplotspur80[[153]]
 22455 505927 516264 524860 545205 639576 
 1345  15389  15738  16029  16711  19410 

这给了我 plotID 作为我可以使用函数名称提取的名称,如下所示

> names(listplotspur80[[153]])
[1] "22455"  "505927" "516264" "524860" "545205" "639576"

现在我能够提取每个物种的地块列表,我需要将其与每个地块相关联,其基底面积 BA 的值存储在一个名为 BA 的数据框中。

 >       head(BA)
          BA plotID
19 41.72365     19
23 13.37109     23
27 55.92989     27
41 25.50725     41
45 34.86734     45
47 30.63582     47

>       dim(BA)
[1] 44065     2

因此,从这个元素列表中,我有每个物种的地块列表和数据框 BA,其中我有与每个地块相关联的 BA,我想从这些地块中计算每个物种的最小值、最大值和平均值,并将其存入新的数据框。

#Create a loop that does the job!
  outG80<-matrix(nrow=153, ncol=3, NA)
  for (i in 1:153 ){
    outG80[i,1]<-min(BA[which(BA$plotID==as.numeric(names(listplotspur80[[i]]))),1])

对于每个物种,我根据列表选择与我拥有的 plotID 对应的行,并将该函数应用于所有对应的 BA(BA 的第 1 列)。

   outG80[i,2]<-max(BA[which(BA$plotID==as.numeric(names(listplotspur80[[i]]))),1])
    outG80[i,3]<-mean(BA[which(BA$plotID==as.numeric(names(listplotspur80[[i]]))),1])
    }
  outG80<-as.data.frame(outG80)
  names(outG80)<-c("Gmin","Gmax","Gmean")
  outG80

所以循环工作,我能够得到一个我想要的数据框......但它只是不是好的结果,我找不到原因。看到最小值和最大值是相同的,而我知道第一个物种有 1422 个不同的地块,例如 BA 的值不同。

  Gmin     Gmax    Gmean
1 33.23970 33.23970 33.23970
2 29.89472 29.89472 29.89472
3 13.90947 43.33606 28.62277
4 17.91288 17.91288 17.91288
5      Inf     -Inf      NaN
6 11.42602 11.42602 11.42602

如果您对我的循环中的错误有任何想法,请告诉我。

非常感谢你的帮助。

我一直在尝试编写一些可以用来复制问题的代码,但我最终得到了巨大的数据框。很抱歉给您带来不便。

4

1 回答 1

1

这是一个小的可重现数据集的样子:

set.seed(5)
BA <- data.frame(BA=round(runif(5,0,10),1), plotID=11:15)
purs80 <- matrix(sample(c(0,90), 4*6, prob=c(0.8, 0.2), replace=TRUE), ncol=6)
colnames(purs80) <- paste("sp", 1:ncol(purs80), sep="")
rownames(purs80) <- sample(BA$plotID)[1:4]

在这种情况下,我将首先以与数据框中BA相同的顺序获取值,purs80然后在 apply 函数中获取最小值、最大值和平均值。

ordered.BA <- BA$BA[match(rownames(purs80), BA$plotID)]
out <- t(apply(purs80, 2, function(v) {
  use <- ordered.BA[which(v > 80)]
  if(length(use)==0) c(Gmin=NA, Gmax=NA, Gmean=NA)
  else c(Gmin=min(use), Gmax=max(use), Gmean=mean(use))
}))

以下是数据和结果:

> BA
   BA plotID
1 2.0     11
2 6.9     12
3 9.2     13
4 2.8     14
5 1.0     15

> purs80
   sp1 sp2 sp3 sp4 sp5 sp6
15   0   0   0  90   0   0
12   0   0   0   0   0   0
11  90   0   0  90   0  90
13  90   0   0  90   0   0

> out
    Gmin Gmax    Gmean
sp1    2  9.2 5.600000
sp2   NA   NA       NA
sp3   NA   NA       NA
sp4    1  9.2 4.066667
sp5   NA   NA       NA
sp6    2  2.0 2.000000
于 2013-03-01T14:43:25.913 回答