For循环工作但不是预期的

时间:2013-03-01 10:58:25

标签: r for-loop

我正在制作一个计算三列的循环:几个图的测量的最小值,最大值和平均值。我正在研究数千个地块的几次测量的森林清单。 我想要做的是计算物种之间不同特定地块的每个物种(总共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

如果你对我的循环中的错误有所了解,请告诉我。

非常感谢你的帮助。

我一直在尝试做一些你可以用来复制问题的代码,但我最终得到了庞大的数据框架。抱歉这个不方便。

1 个答案:

答案 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