如何计算间隔清空陷阱的每日甲虫捕获量(R语言实现)
计算陷阱清空间隔内的甲虫日捕获量
现有甲虫捕获量及陷阱清空的年积日(doy)数据,需计算陷阱每周期清空时的每日甲虫捕获量,计划按以下步骤实现:
- 补全缺失的doy日期
- 计算陷阱清空间隔的天数(包含清空当日)
- 将捕获量按间隔天数均分得到每日数量
已完成部分R代码,以下是完整实现方案:
library(dplyr) # 示例数据 df <- data.frame(count = c(10,15,23), doy = c(6, 11,15)) # 生成目标日期范围的数据集 doy.df <- data.frame(doy = 5:20) # 完整计算流程 result <- doy.df %>% full_join(df, by = "doy") %>% arrange(doy) %>% mutate(c0 = coalesce(count, 0)) %>% mutate(cumsum = cumsum(c0)) %>% # 标记每个清空周期的分组:找到所有有count的行,向前填充分组ID mutate(group_id = ifelse(!is.na(count), row_number(), NA)) %>% fill(group_id, .direction = "up") %>% # 计算每个周期的天数:当前周期下一个清空日 - 当前周期起始日 +1 group_by(group_id) %>% mutate(period = lead(doy, default = first(doy)) - first(doy) + 1) %>% ungroup() %>% # 计算每日捕获量:当前周期的总捕获量 / 周期天数;无后续数据的日期设为NA mutate(daily = ifelse(!is.na(group_id), count[match(group_id, which(!is.na(count)))] / period, NA)) %>% # 调整列顺序,匹配预期输出 select(doy, count, c0, cumsum, period, daily) # 查看结果 print(result, na.print = "NA")
预期输出
doy count c0 cumsum period daily 1 5 NA 0 0 2 5 2 6 10 10 10 2 5 3 7 NA 0 10 5 3 4 8 NA 0 10 5 3 5 9 NA 0 10 5 3 6 10 NA 0 10 5 3 7 11 15 15 25 5 3 8 12 NA 0 25 4 6 9 13 NA 0 25 4 6 10 14 NA 0 25 4 6 11 15 23 23 48 4 6 12 16 NA 0 48 NA NA 13 17 NA 0 48 NA NA 14 18 NA 0 48 NA NA 15 19 NA 0 48 NA NA 16 20 NA 0 48 NA NA
代码说明
- 补全日期:通过
full_join将目标日期范围和原始数据合并,补全缺失的doy日期 - 周期分组:用
group_id标记每个清空周期,通过fill向前填充分组ID,确保周期内所有日期属于同一分组 - 计算周期天数:每个周期的天数为下一个清空日(或当前周期起始日,若为最后一个周期)减去当前周期起始日再加1,确保包含清空当日
- 计算日捕获量:将每个周期的总捕获量除以周期天数,得到该周期内每日的平均捕获量;无后续清空数据的日期,
daily设为NA
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

