我正在製作一個循環來計算三列:幾個圖的測量的最小值,最大值和平均值。我正在處理數千個地塊的幾次測量森林清單。 我想要做的是在物種不同的特定地塊上計算每個物種(共153種)的基底面積的最小值,最大值和平均值(測量值)。For循環工作,但並非如期推進
首先,我必須選擇,對於每個物種,所有符合條件的曲線從PURS(曲線被PURS ==地塊的至少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])
對於每個物種,我選擇對應於我已根據該列表的plotIDs行和我將所述函數應用於所述所有相應的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
如果您對我的循環中的錯誤有任何瞭解,請告訴我。
非常感謝您的幫助。
我一直在試圖做一些代碼,你可以用它來複制這個問題,但我最終得到了巨大的數據框架。對不起,這很不方便。
你可能需要看看什麼'名字(listplotspur80 [我]])'真的返回給你的。既然你沒有發佈(小)樣本的'spur80'或'listplotspur80'或'BA'數據框,我們不可能指出這個錯誤。我不得不說,作爲一般規則,將數字數據放入「名稱」(或從中提取數字數據)是一個壞主意。 – 2013-03-01 13:34:48
謝謝你的幫助。我編輯了這個問題並添加了數據框架的樣本。如果它可以幫助那會很好。 – Tom 2013-03-01 14:13:04
它更清楚但仍難以弄清楚。也許'%in%'不是'=='?一個可重複的例子會有很大的幫助,特別是用更多的R-ISH方式編寫解決方案。 – Aaron 2013-03-01 14:22:58