我正在制作一个循环来计算三列:最小值、最大值和几个图的测量平均值。我正在处理数千个地块的几个测量值的森林清单。我想要做的是计算每个物种(总共 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
如果您对我的循环中的错误有任何想法,请告诉我。
非常感谢你的帮助。
我一直在尝试编写一些可以用来复制问题的代码,但我最终得到了巨大的数据框。很抱歉给您带来不便。