如何在R中针对多参数组合批量运行种群估算函数
批量计算不同调查期、河段、鱼类物种的种群估计值
我正在自学R语言,需要编写代码估算不同调查期(Survey)、河段(Site)下不同鱼类物种的种群数量。目前代码仅能针对单一参数组合(如Survey=3、Site=b、Species=scul)运行removal()函数得到种群估计值(PE)及置信区间(UCI、LCI),无法自动遍历所有参数组合完成批量计算并生成统一结果表。尝试过循环和自定义函数但未成功,对列表、向量等数据结构的协同处理存在困惑,寻求可行的批量实现方案。
现有代码:
library(tidyverse) library(FSA) set.seed(1) #random sample dataframe df <- data.frame( Survey = rep(c(1,2,3), each = 45), Site = rep(c("a","b","c","d","e"), times = 3, each = 9), Run = rep (c(1,2,3), 15, each = 3), Species = rep(c("brt", "rbt", "scul"), times = 45), Count = sample(1:15)) # get number of species caught at each run per survey per site count_summary <- df %>% group_by(Survey, Site, Run, Species) %>% summarise(n = sum(Count))%>% rename("Count" = "n") %>% ungroup # SPECIFY catch data sp_count <- count_summary %>% filter(Species == "scul", Survey == 3, Site =="b") # Make catch a vector so removal() will run catch <- as.vector(sp_count$Count) # Calculate population estimate pop_est <- removal(catch) #pulls the relevant list, transforms to a dataframe, transposes, #transforms to a dataframe again df_pop_est <- as.data.frame(t(as.data.frame(pop_est$est))) # keeps only the relevant numbers (pop estimate, lower CI, upper CI) pe_ci <- df_pop_est %>% select(No, No.UCI, No.LCI)%>% rename(PE = No, LCI = No.LCI, UCI = No.UCI) pe_ci
期望输出格式:
Survey Site Species PE UCI LCI 3 b scul 55 142.1708 -32.17078 3 a scul x y z 2 a rbt x y z 1 e brt x y z 1 d scul x y z
批量实现方案
可以利用tidyverse的分组嵌套(nest())+ 映射(map())功能,批量处理每个参数组合:
library(tidyverse) library(FSA) set.seed(1) # 生成示例数据(和原代码一致) df <- data.frame( Survey = rep(c(1,2,3), each = 45), Site = rep(c("a","b","c","d","e"), times = 3, each = 9), Run = rep (c(1,2,3), 15, each = 3), Species = rep(c("brt", "rbt", "scul"), times = 45), Count = sample(1:15)) # 按调查期、河段、采样轮次、物种汇总捕获量 count_summary <- df %>% group_by(Survey, Site, Run, Species) %>% summarise(Count = sum(Count), .groups = "drop") # 定义处理单个分组的函数:输入捕获量向量,返回PE、UCI、LCI的 dataframe calc_pop_est <- function(catch_vec) { pop_est <- removal(catch_vec) as.data.frame(t(as.data.frame(pop_est$est))) %>% select(No, No.UCI, No.LCI) %>% rename(PE = No, LCI = No.LCI, UCI = No.UCI) } # 分组嵌套并批量计算 final_results <- count_summary %>% # 按Survey、Site、Species分组,嵌套Run和Count数据 nest(data = c(Run, Count)) %>% # 对每个分组的捕获量向量应用计算函数 mutate(pop_stats = map(data, ~calc_pop_est(.x$Count))) %>% # 展开统计结果,同时丢弃嵌套的原始数据 unnest(pop_stats) %>% select(-data) # 查看结果 head(final_results)
代码说明:
nest():将每个Survey-Site-Species组合对应的Run和Count数据嵌套成列表列,方便后续批量处理。- 自定义函数
calc_pop_est():封装原代码中从捕获量向量到提取PE、置信区间的逻辑,避免重复代码。 map():遍历每个嵌套的分组数据,调用calc_pop_est()生成统计结果。unnest():将嵌套的统计结果展开为常规列,最终得到统一的结果表。
运行上述代码后,final_results就是你需要的包含所有参数组合的种群估计值及置信区间的表格。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

