处理R中tapply()与ddply{plyr}的输出:长度不等的子集
我有一个数据帧:处理R中tapply()与ddply{plyr}的输出:长度不等的子集,r,subset,plyr,R,Subset,Plyr,我有一个数据帧: > df <- data.frame( + Species = rep(LETTERS[1:4], times=c(5,6,7,6)), + Length = rep(11:14, each=3) + ) > > df 但我显然没有正确的答案,而且我甚至不确定ddply()是否适合我的问题,因为我对每个物种的长度观测数量不同 我是否应该更仔细地研究plyr中的其他选项?或者有没有一种方法可以编写for循环来完成我需要的任务?您走对了方向ta
> df <- data.frame(
+ Species = rep(LETTERS[1:4], times=c(5,6,7,6)),
+ Length = rep(11:14, each=3)
+ )
>
> df
但我显然没有正确的答案,而且我甚至不确定ddply()是否适合我的问题,因为我对每个物种的长度观测数量不同
我是否应该更仔细地研究plyr中的其他选项?或者有没有一种方法可以编写for循环来完成我需要的任务?您走对了方向<使用列表输出的code>tapply绝对是一种方法,而且可能是一个不错的选择,因为您的输出将具有不同的长度
ddply
,正如您所猜测的,是另一种方式。关键是,您给ddply的函数的输出应该是一个数据帧,其中所有统计数据都处于“长”模式(这样它们就可以很好地堆叠)。简单的count
函数无法做到这一点,因此您需要创建自己的函数。我为ddply调用设计函数的方法实际上与您所做的非常相似:我获取数据的一个子集,然后使用它来构建我的函数。然后,当您将其提交给ddply时,它将很好地将该函数应用于所有子集
SpeciesStats <- function(df) {
counts = table(df$Length)
densities = counts/30
delta.N = diff(densities, lag=1, differences=1)
data.frame(Length = names(counts),
Count = as.numeric(counts),
Density = as.numeric(densities),
delta.N = c(NA, delta.N),
row.names=NULL)
}
通过使用
plyr
df1 <- ddply(df, .(Species, Length), count)
df2 <- ddply(df1, .(Species), mutate, Dens = freq/30, Del = diff(c(NA, Dens)))
df1我不确定您的问题到底是什么,但我怀疑您的第一步应该是确定您希望输出包含什么内容。使用列名称和值以及所需信息绘制数据框。这可能会给你(和我们)一些关于该怎么做的线索。@gkcn:这些数据来自哪里?你是OP吗?@ThiefMaster这是原始帖子中的数据,我刚打印出来看看到底是什么。谢谢John!这非常有效,并提供了一个非常干净的输出。它还为我连接了一些点,关于如何设置通过ddply运行的函数…:)@Christy Perfect!我很高兴这有帮助。
ddply(df$Length, df$Species,
count)
SpeciesStats <- function(df) {
counts = table(df$Length)
densities = counts/30
delta.N = diff(densities, lag=1, differences=1)
data.frame(Length = names(counts),
Count = as.numeric(counts),
Density = as.numeric(densities),
delta.N = c(NA, delta.N),
row.names=NULL)
}
df1 <- ddply(df, .(Species, Length), count)
df2 <- ddply(df1, .(Species), mutate, Dens = freq/30, Del = diff(c(NA, Dens)))