2013-03-01 20 views
0

我正在製作一個循環來計算三列:幾個圖的測量的最小值,最大值和平均值。我正在處理數千個地塊的幾次測量森林清單。 我想要做的是在物種不同的特定地塊上計算每個物種(共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 

如果您對我的循環中的錯誤有任何瞭解,請告訴我。

非常感謝您的幫助。

我一直在試圖做一些代碼,你可以用它來複制這個問題,但我最終得到了巨大的數據框架。對不起,這很不方便。

+0

你可能需要看看什麼'名字(listplotspur80 [我]])'真的返回給你的。既然你沒有發佈(小)樣本的'spur80'或'listplotspur80'或'BA'數據框,我們不可能指出這個錯誤。我不得不說,作爲一般規則,將數字數據放入「名稱」(或從中提取數字數據)是一個壞主意。 – 2013-03-01 13:34:48

+0

謝謝你的幫助。我編輯了這個問題並添加了數據框架的樣本。如果它可以幫助那會很好。 – Tom 2013-03-01 14:13:04

+0

它更清楚但仍難以弄清楚。也許'%in%'不是'=='?一個可重複的例子會有很大的幫助,特別是用更多的R-ISH方式編寫解決方案。 – Aaron 2013-03-01 14:22:58

回答

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