2014-12-06 58 views
0

我早先問過「如何將兩列顯示爲二進制(存在/不存在)矩陣?」。這個問題得到兩個很好的答案。現在我想更進一步,通過物種欄向原始地點添加第三欄,以反映每個地塊中每個物種的生物量。如何通過物種基質在一個位置顯示植物物種的生物量?

第1列(小區)指定〜200個地塊的代碼,第2列(物種)指定約1200個物種的代碼,第3列(生物量)指定乾重。每個小區有> 1個物種,每個物種可以出現在> 1個小區。行的總數爲〜2700

> head(dissim) 
    plot species biomass 
1 a1f56r jactom 20.2 
2 a1f56r zinunk 10.3 
3 a1f56r mikcor 0.4 
4 a1f56r rubcle 1.3 
5 a1f56r sphoos 12.4 
6 a1f56r nepbis1 8.2 

tail(dissim) 
      plot species biomass 
2707 og100m562r selcup 4.7 
2708 og100m562r pip139 30.5 
2709 og100m562r stasum 0.1 
2710 og100m562r artani 3.4 
2711 og100m562r annunk 20.7 
2712 og100m562r rubunk 22.6 

我想創建由物種矩陣的曲線圖,其顯示每個物種的生物質在各小區(而不是二進制存在/不存在基質),的東西形式:

jactom rubcle chrodo uncgla 
a1f56r 1.3 0 10.3 0 
a1f17r 0 22.3 0 4 
a1m5r 3.2 0 3.7 9.7 
a1m5r 1 0 0 20.1 
a1m17r 5.4 6.9 0 1 

任何有關如何添加這種額外的複雜程度的意見將非常感激。

+0

我們e:'reshape :: cast(dissim,plot〜species,value ='biomass',fun = mean)',如下所示:http://stackoverflow.com/questions/6798327/calculating-the-mean-of-values -in-tables-using-formula-r – Tim 2014-12-09 14:53:39

+0

偉大的建議,謝謝 – tabtimm 2014-12-09 16:53:34

+0

在未來考慮開始一個新的問題,如果你有其他問題。但是,在這種情況下,搜索存檔就足夠了。 – Tim 2014-12-09 17:02:20

回答

4

xtabs和tapply函數返回一個矩陣表:

# Using MrFlick's example 
> xtabs(~a+b,dd) 
    b 
a f g h i j 
    a 0 1 0 2 3 
    b 0 0 2 1 0 
    c 0 3 0 0 1 
    d 2 2 2 1 1 
    e 1 1 2 4 1 

# --- the tapply solution is a bit less elegant 
> dd$one=1 
> with(dd, tapply(one, list(a,b), sum)) 
    f g h i j 
a NA 1 NA 2 3 
b NA NA 2 1 NA 
c NA 3 NA NA 1 
d 2 2 2 1 1 
e 1 1 2 4 1 

# If you want to make the NA's become zeros then: 

> tbl <- with(dd, tapply(one, list(a,b), sum)) 
> tbl[is.na(tbl)] <- 0 
> tbl 
    f g h i j 
a 0 1 0 2 3 
b 0 0 2 1 0 
c 0 3 0 0 1 
d 2 2 2 1 1 
e 1 1 2 4 1 
+0

這兩個答案確實非常有幫助。 – tabtimm 2014-12-09 14:08:51

4

樣本數據

set.seed(15) 
dd<-data.frame(
    a=sample(letters[1:5], 30, replace=T), 
    b=sample(letters[6:10], 30, replace=T) 
) 

如果你知道每次出現只出現一次,你可以做

with(dd, table(a,b)) 

# b 
# a f g h i j 
# a 0 1 0 2 3 
# b 0 0 2 1 0 
# c 0 3 0 0 1 
# d 2 2 2 1 1 
# e 1 1 2 4 1 

如果他們潛在的複製,你只想跟蹤存在/不存在,你可以做

with(unique(dd), table(a,b)) 
# or 
with(dd, (table(a,b)>0)+0) 

# b 
# a f g h i j 
# a 0 1 0 1 1 
# b 0 0 1 1 0 
# c 0 1 0 0 1 
# d 1 1 1 1 1 
# e 1 1 1 1 1 
1

您還詢問了有三個變量的解決方案。下面我提供您要求的兩種解決方案。

首先,讓我們來設置數據的數據:

set.seed(15) 
dd<-data.frame(
    a=sample(letters[1:5], 30, replace=T), 
    b=sample(letters[6:10], 30, replace=T), 
    c=sample(letters[1:3], 30, replace=T) 
) 

如果你有三個獨立的變量,只想計算的出現,在這裏您可以通過@MrFlick有一個版本的解決方案:

by(dd, dd$c, function(x) with(x, table(a, b))) 

如果你想第三個變量的平均值可以使用this solution

reshape::cast(dd, a ~ b, value = 'c', fun = mean) 
+0

這很好,謝謝。但是,在矩陣上使用函數metaMDS執行NMDS的下一步會產生錯誤消息,因此我發佈了一個額外的問題http://stackoverflow.com/questions/27392653/how-to-use-dissimilarity-matrix-與函數metamds – tabtimm 2014-12-10 03:09:27

+0

@tabtimm參觀(http://stackoverflow.com/tour)如何工作 - 這將有助於獲得最好的網站和社區。請記住,如果您發現某個答案有幫助或誤導性,並且接受一個答案,並且您發現答案會回答您的問題,以便其他人知道問題已得到解決,則可以投票或投票。 – Tim 2014-12-10 07:27:36