2017-08-10 1 views
2

ich so einen Datensatz viel haben:Die mittlere Anzahl von Individuen/ha pro Spezies in 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)) 

Die Plot_ID ist die Handlung, wo die Art wurden acessed, ist der Name der Name der Art und der Anzahl ist die Menge, die in dieser Handlung gefunden wird. Ich möchte pro Spezies die Anzahl der Individuen insgesamt herausfinden.

Mein Problem ist, dass natürlich nicht jede Art in jeder Handlung vertreten ist. In diesem Fall würde die mittlere Anzahl von Individuen von Spec2 3/3 pro Diagramm betragen. Wenn ich die Aggregatfunktion so verwende:

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

Die Anzahl der Personen für Spec2 ist 3, was nicht das ist, was ich wollte. Und ich möchte nicht wirklich jede Art in jede Handlung mit einem 0-Wert hinzufügen, wo sie nicht erscheint.

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

Das Ergebnis für Spec4 sollte 2/5 = 0,4? –

+0

Eigentlich 2/3 = 0,66, ist der Mittelwert pro Diagramm wichtig. Sorry, ich habe einen Fehler gemacht – Lukas

Antwort

2

Sie dplyr verwenden können ...

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) 

Ergebnis:

# 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 

EDID Zu meinem gewünschten Ergebnis

Mein gewünschtes Ergebnis wäre so etwas zu klären

Wenn Sie wollen er führt zu einem Vektor, können Sie die pull Funktion (dplyr> = 0,7) verwenden:

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

Danke! Ich denke, das ist die richtige Richtung, aber es zeigt mir die durchschnittliche Anzahl von Individuen pro Handlung, für jede Handlung getrennt. Aber ich suche nach dem Gesamtmittelwert (ich habe mein gewünschtes Ergebnis in meiner Frage angegeben) – Lukas

+1

Aktualisierter Code, alle Zeilen übereinstimmen mit Ausnahme des letzten - können Sie mehr Details angeben, wenn dies nicht korrekt ist? –

+0

Ich sehe jetzt, ich habe das in Eile getan. Das tut mir leid. Die Menge, mit der ich es wiedergeben möchte, ist die Anzahl der Ebenen, die "Plot_ID" hat, also tatsächlich 3 in diesem Fall. Aber ich denke ich kann damit woken, was du mir gien hast. Wie kann ich das gesamte Ergebnis als data.frame exportieren? – Lukas

Verwandte Themen