You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:41:00