如何让FSA包的depletion函数与dplyr协同实现分组计算?
解决方案
方法1:用dplyr的group_modify(兼容多数dplyr版本)
group_modify能对每个分组的子数据框执行自定义操作,刚好适配depletion需要完整子数据框的调用要求,代码示例:
library(dplyr) library(FSA) df <- data.frame(site = c('site1','site1','site1','site2','site2','site2','site3','site3','site3'), catch = c(30,10,3,40,12,3,10,3,1), effort = c(600,550,500,800,800,700,400,425,375)) # 分组计算并整理结果 result <- df %>% group_by(site) %>% group_modify(~ { # 对当前分组的子数据框调用depletion dep_out <- depletion(.$catch, .$effort, method = 'Leslie') # 将函数返回的估计值转为数据框,方便合并输出 as.data.frame(dep_out$estimates) }) print(result)
这里~符号内的.代表当前分组的子数据框,用.$catch和.$effort就能满足depletion的参数格式要求,最后把估计值转为数据框,会自动和site分组列合并输出。
方法2:用purrr嵌套+映射(灵活的tidyverse风格)
如果习惯purrr的函数逻辑,可先把数据按site嵌套,再对每个子数据框批量调用depletion:
library(dplyr) library(FSA) library(purrr) library(tidyr) # 嵌套数据→映射计算→展开结果 result <- df %>% nest(data = c(catch, effort)) %>% mutate(depletion_res = map(data, ~ depletion(.$catch, .$effort, method = 'Leslie')$estimates)) %>% unnest(depletion_res) %>% select(-data) print(result)
nest把每个site对应的catch和effort打包成子数据框,map遍历这些子数据框执行计算,最后unnest把嵌套的结果展开成规整数据框。
补充说明
- 两种方法都无需写for循环,符合tidyverse的编程习惯
depletion返回的结果里,estimates是包含种群数量、捕捞死亡率等核心估计值的数据框;如果需要置信区间等其他输出,可调整提取的部分(比如dep_out$conf.int)
内容的提问来源于stack exchange,提问作者Keane Flynn
相关产品推荐
相关产品推荐

