0

私は、いくつかのプロットの測定の最小値、最大値、平均値の3つの列を計算するためのループの作成に取り組んでいます。私は何千もの区画でいくつかの測定値の森林インベントリーを扱っています。私がやりたいのは、種間で異なる特定のプロットで、各種(合計153種)の基底面積の最小値、最大値、平均値(測定値)を計算することです。

まず、種ごとに、基準に一致するすべてのプロット(プロッ​​トはpurs ==プロットの少なくとも80%は1つの種のみで構成されています)をpurs80から選択する必要があります。

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取得し、次に適用関数内で最小、最大、平均を取得します。

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 に答える