【发布时间】:2011-11-02 18:04:54
【问题描述】:
我有一个数据框:
> 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
这给了我我想要的,但是输出的格式很时髦,我不知道如何对结果进行额外的分析。
我尝试过使用 plyr 中的 ddply(),类似于:
ddply(df$Length, df$Species,
count)
但我显然不正确,而且我什至不确定 ddply() 是否适合我的问题,因为我对每个物种有不同数量的长度观察。
我是否应该更仔细地研究 plyr 中的其他选项?或者有没有办法写一个 for 循环来做我需要的?
【问题讨论】:
-
我不确定您的问题究竟是什么,但我怀疑您的第一步应该是决定确切您希望输出包含什么。使用您想要的信息绘制包含列名称和值的数据框。这可能会给您(和我们)一些关于该做什么的线索。
-
@gkcn:这些数据是从哪里来的?你是 OP 吗?
-
@ThiefMaster 这是原帖的数据,我刚刚打印出来看看到底是什么。