我正在制作一个计算三列的循环:几个图的测量的最小值,最大值和平均值。我正在研究数千个地块的几次测量的森林清单。 我想要做的是计算物种之间不同特定地块的每个物种(总共153种)的基础面积(测量值)的最小值,最大值和平均值。
首先,我必须为每个物种选择符合标准的所有图(图中的图表= =至少80%的图表仅由一个物种组成)来自图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
如果你对我的循环中的错误有所了解,请告诉我。
非常感谢你的帮助。
我一直在尝试做一些你可以用来复制问题的代码,但我最终得到了庞大的数据框架。抱歉这个不方便。
答案 0 :(得分: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函数中获取min,max和mean。
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