2014-02-19 71 views
0

我仍然學習使用data.table(從data.table包),甚至在尋找網絡和幫助文件的幫助後,我仍然努力做我想做的事情。 我有一個超過60列(前三個對應的因素和其餘的響應變量,在這種情況下不同的物種)和數行對應的不同級別的治療和物種丰度大型數據表。一個非常小的版本是這樣的:協同矩陣從一個社區名單與分組因素

> TEST<-data.table(Time=c("0","0","0","7","7","7","12"), 
      Zone=c("1","1","0","1","0","0","1"), 
      quadrat=c(1,2,3,1,2,3,1), 
      Sp1=c(0,4,29,9,1,2,10), 
      Sp2=c(20,17,11,15,32,15,10), 
      Sp3=c(1,0,1,1,1,1,0)) 
>setkey(TEST,Time) 

> TEST 
    Time Zone quadrat Sp1 Sp2 Sp3 
1: 0 1  1 0 20 1 
2: 0 1  2 4 17 0 
3: 0 0  3 29 11 1 
4: 12 1  1 10 10 0 
5: 7 1  1 9 15 1 
6: 7 0  2 1 32 1 
7: 7 0  3 2 15 1 

我需要計算的協方差的總和每個X區樣方羣。如果我只有一個給定Zone x樣方組合的物種列表,那麼我可以使用cov()函數,但使用cov()的方式與我將使用mean()或sum()的方式相同

Abundance = TEST[,lapply(.SD,mean),by="Zone,quadrat"] 

我得到以下錯誤消息不起作用:

Error in cov(value) : supply both 'x' and 'y' or a matrix-like 'x' 

我明白爲什麼,但我無法弄清楚如何解決這個問題。

我真正想要的是能夠獲得,對於每個Zone x樣方組合,所有物種的所有采樣時間點的協方差矩陣。從每個矩陣中,我需要計算所有物種對的協方差總和,這樣我就可以得到每個區域x樣方組合的協方差總和。

任何幫助將不勝感激,謝謝。

+1

您的'test'不起作用,因爲列的長度不一樣。它也不像你在這裏展示的'TEST'。另外,你是否需要'Time'變量作爲例子?最後,你想要的輸出是什麼樣的?矩陣列表? – Frank

+0

我的道歉,錯誤的版本複製在:我編輯了問題,以糾正它。是的,我需要Time變量,因爲這是應該計算協方差的變量。我也編輯了這個問題,以更具體地說明我在找什麼。 –

+0

好吧,像'TEST [,sum(upper.tri(cov(.SD))),by ='Zone,quadrat',。SDcols = paste('Sp',1:3,sep ='')] '? – Frank

回答

0

由@Frank和我周圍使用upper.tri功能做了一些額外的搜索上面提供的幫助,下面的代碼工作:

Cov= TEST[,sum(cov(.SD)[upper.tri(cov(.SD), diag = FALSE)]), by='Zone,quadrat', .SDcols=paste('Sp',1:3,sep='')]

提出的最初版本,其中upper.tri()沒僅在協方差矩陣中出現在[]中提取的邏輯值,並允許diag = FALSE在求和矩陣的上三角之前排除對角線值。在我的情況下,我不在乎它是否是三角形的上部或下部,但我確信使用lower.tri()可以很好地工作。

我希望這可以幫助其他可能遇到類似問題的用戶。