У меня есть фрейм данных:
> df <- data.frame(
+ Species = rep(LETTERS[1:4], times=c(5,6,7,6)),
+ Length = rep(11:14, each=3)
+ )
>
> df
Мне нужно иметь возможность подсчитать количество особей определенной длины для каждого вида (т. Е. Сколько особей в Виде Aимеют длину 1, 2, 3 и т. д.?) Затем мне нужно выполнить серию дополнительных анализов на выходе.Например, мне нужно рассчитать плотность особей каждой длины и уменьшение плотности от одного класса длины к следующему.
Это легко, если я сначала подмножеству данных:
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
Проблема заключается в том, что мне нужно выполнить эти вычисления для каждого вида (т. Е. Выполнить цикл по каждому подмножеству).
С одной стороны, я мог бы использовать tapply () с функцией, которая использует table ();
#function: count number of specimens of each length;
count<-function(x){
table(x)
}
Number<-tapply(df$Length, df$Species, FUN=count, simplify=FALSE)
Number
Это дает мне то, что я хочу, но формат выводафанк, и я не могу понять, как выполнить дополнительный анализ результатов.
Я пытался использовать ddply () из plyr, что-то вроде:
ddply(df$Length, df$Species,
count)
Но я явно ненеправильно, и я даже не уверен, что ddply () подходит для моей проблемы, учитывая, что у меня разное количество наблюдений длины для каждого вида.
Должен ли я присматриваться к другимварианты в плир?Или есть способ написать цикл для , чтобы сделать то, что мне нужно?