私は、いくつかのプロットの測定の最小値、最大値、平均値の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
私のループの間違いについて何か考えがあれば、私に知らせてください。
どうもありがとうございました。
問題を再現するために使用できるコードを実行しようとしていますが、データフレームが巨大になってしまいます。ご不便をおかけして申し訳ございません。