2017-08-10 35 views
2

我有很多像這樣的數據集數:平均個人R中每個物種/公頃

dat<-data.frame(Plot_ID=c("P_1","P_1","P_2","P_3","P_3"), 
       Name=c("Spec1","Spec2","Spec3","Spec1","Spec4"), 
       Number=c(2,3,1,5,2)) 

的Plot_ID是在物種acessed的情節,名稱是物種的數量和名稱是在該圖中找到的數量。我想找出每個物種總體個體的數量。

我的問題是,當然不是每個物種都在每個地塊中表示。在這種情況下,Spec2的平均數量爲每個地塊3/3。如果我使用如下集合函數:

agg.1<-aggregate(dat$Number, list(dat$Name),mean) 

Spec2的個人數量是3,這不是我想要的。而且我並不是真的想把每個物種都添加到每個有0值的地塊中,但沒有出現。

EDID爲了澄清我想要的結果

我期望的結果是類似的東西:

Name N/plot 
Spec1 2.3 #Amount of individuals=7/Amount of plots=3 
Spec2 1 #3/3 
Spec3 0.3 #1/3 
Spec4 0.6 #2/3 
+0

Spec4的結果應該是2/5 = 0.4? –

+0

實際上2/3 = 0.66,每個圖的平均值很重要。對不起,我犯了一個錯誤 – Lukas

回答

2

您可以使用dplyr ...

library(dplyr) 

# output to dataframe newdf 
newdf <- dat %>% 
    group_by() %>% 
    mutate(n = n()) %>% 
    ungroup() %>% 
    group_by(Name, n) %>% 
    summarise(total = sum(Number)) %>% 
    mutate(agg.1 = total/n) 

結果:

# A tibble: 4 x 4 
# Groups: Name [4] 
    Name  n total agg.1 
    <fctr> <int> <dbl> <dbl> 
1 Spec1  5  7 1.4 
2 Spec2  5  3 0.6 
3 Spec3  5  1 0.2 
4 Spec4  5  2 0.4 

如果你想要t他導致一個向量,你可以使用pull函數(dplyr> = 0.7):

agg1. <- dat %>% 
    group_by() %>% 
    mutate(n = n()) %>% 
    ungroup() %>% 
    group_by(Name, n) %>% 
    summarise(total = sum(Number)) %>% 
    mutate(agg.1 = total/n) %>% 
    pull(agg.1) 
+0

謝謝!我認爲這是正確的方向,但是它顯示了每個小區的單獨平均個體數量。但我尋找整體的意思(我指定我的問題想要的結果) – Lukas

+1

更新的代碼,所有行匹配,除了最後一個 - 如果這不正確,你能提供更多細節嗎? –

+0

我現在看到,我很急。我很抱歉。我想要提供的數量是「Plot_ID」所具有的等級數量,所以在這種情況下實際上是3。但我認爲我可以用這個來炒作,你有什麼感覺我。如何將整個結果導出爲data.frame? – Lukas