为 ddply {plyr} 定义值范围以在进行组合时使用

Defining a range of values for ddply {plyr} to use when making combinations

我有相机陷阱数据,其格式包含每次观察的捕捉日期、物种和个体数量。例如:

> df
      Date Sp Num
1 1/1/2015  a   1
2 1/1/2015  a   1
3 1/1/2015  b   2
4 1/3/2015  a   4

我想对给定日期记录的每个物种的总数求和,但也扩展数据集,以便每个日期和物种组合都有一个条目,没有观察到的日期的值为零给定的物种。我可以使用 ddply {plyr} 和 .drop=FALSE 命令来做到这一点。

> ddply(df, c("Date", "Sp"), function(df)sum(df$Num), .drop=FALSE)
      Date Sp V1
1 1/1/2015  a  2
2 1/1/2015  b  2
3 1/3/2015  a  4
4 1/3/2015  b  0

问题是有些日子没有对任何物种进行观察(在上面的例子中,这将是 1/2/2015)。我想要 return 是这样的:

> df
      Date Sp Num
1 1/1/2015  a   2
2 1/1/2015  b   2
3 1/2/2015  a   0
4 1/2/2015  b   0
5 1/3/2015  a   4
6 1/3/2015  b   0

有没有办法在向量中定义日期范围并要求 ddply 使用它而不是仅使用原始数据帧中的唯一日期?

我对 R 和 SO 比较陌生,所以如果这个问题太复杂,我提前道歉。

我们将 'Date' 转换为 Date class。使用从最小到最大 "Date" 的序列和 "Sp" 的 unique 元素的组合创建一个新数据集。我们要么 merge (来自 base R),要么在我们得到 'Num' 列的 sum 后使用 dplyrleft_join 按 'Date' 和 'Sp'.

df$Date <- as.Date(df$Date, "%m/%d/%Y")
df1 <- expand.grid(Date=seq(min(df$Date), max(df$Date),
    by = "1 day"), Sp=unique(df$Sp), stringsAsFactors=FALSE)
library(dplyr)
df %>% 
  group_by(Date, Sp) %>% 
  summarise(Num = sum(Num)) %>%
  left_join(df1, .) %>%
  mutate(Num = replace(Num, is.na(Num), 0)) %>%
  arrange(Date) %>%
  mutate(Date = format(Date, "%m/%d/%Y"))
#        Date Sp Num
#1 01/01/2015  a   2
#2 01/01/2015  b   2
#3 01/02/2015  a   0
#4 01/02/2015  b   0
#5 01/03/2015  a   4
#6 01/03/2015  b   0