Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理R中tapply()与ddply{plyr}的输出:长度不等的子集_R_Subset_Plyr - Fatal编程技术网

处理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)))