Ich habe einen Datenrahmen:
> df <- data.frame(
+ Species = rep(LETTERS[1:4], times=c(5,6,7,6)),
+ Length = rep(11:14, each=3)
+ )
>
> df
Ich muss in der Lage sein, die Anzahl der Personen einer bestimmten Länge zu zählen für jede Spezies (d. h., wie viele Individuen in Art A haben eine Länge von 1, 2, 3 usw.?) Dann muss ich eine Reihe zusätzlicher Analysen mit dem Ergebnis durchführen. Zum Beispiel muss ich die Dichte der Individuen jeder Länge und die Abnahme der Dichte von einer Längenklasse zur nächsten berechnen.
Dies ist einfach, wenn ich die Daten zunächst untergliedert habe:
Spec.A<-df[df$Species=="A",]
#count number of specimens of each length;
count<-table(Spec.A$Length)
count
#calculate density per length category (divide by total area sampled =30)
density<-count/(30)
density
#calculate the decrease in density (delta.N) from one length category to the next;
delta.N<-diff(density, lag=1, differences=1)
delta.N
Das Problem ist, dass ich diese Berechnungen für jede Art durchführen muss (d. h., ich muss eine Schleife durch jede Teilmenge ziehen).
Einerseits könnte ich tapply() verwenden, mit einer Funktion, die table() verwendet;
#function: count number of specimens of each length;
count<-function(x){
table(x)
}
Number<-tapply(df$Length, df$Species, FUN=count, simplify=FALSE)
Number
Damit erhalte ich, was ich will, aber das Format der Ausgabe ist seltsam, und ich kann nicht herausfinden, wie ich zusätzliche Analysen der Ergebnisse durchführen kann.
Ich habe versucht, ddply() von plyr zu verwenden, etwa so:
ddply(df$Length, df$Species,
count)
Aber ich habe es eindeutig nicht richtig, und ich bin nicht einmal sicher, dass ddply() für mein Problem geeignet ist, da ich für jede Art eine andere Anzahl von Längenbeobachtungen habe.
Sollte ich mir andere Optionen in plyr genauer ansehen? Oder gibt es eine Möglichkeit, eine für Schleife zu tun, was ich brauche?