我想使用purrr :: map()运行预先打包的函数fishmethods :: deplet
数据集具有多个年份(请参见下面的示例),我需要每年分别对模型进行拟合。
b <- structure(list(Year = c(2012, 2012, 2012, 2012, 2015, 2015, 2015,
2015), BF_AYAs_count = c(37, 12, 7, 8, 13, 4, 3, 6), BF_noT_effort = c(0.445138888899237,
0.343750000007276, 0.51597222223063, 0.444444444437977, 0.613194444456894,
0.437499999992724, 0.374999999992724, 0.607638888897782)), row.names = c(NA,
-8L), class = c("tbl_df", "tbl", "data.frame"))
耗尽期望以下输入(catch = NULL,effort = NULL,method =“ l”)并输出列表X.out,其中X == method。出于我的目的,我想按年份抓取结果(例如l.out $ results)并将其放入数据框。这是我尝试过的代码,返回Error in deplet(catch = BF_AYAs_count, effort = BF_noT_effort, method = "l") :
object 'BF_AYAs_count' not found
我假设这是一个问题,原因是deplet()函数期望数据输入,因为如果我用map(data, ~lm(BF_AYAs_count~BF_noT_effort, data=.)
代替,则此代码可以正常工作。
library(tidyverse)
library(fishmethods)
bf_AYA_popest <- b %>%
nest(-Year) %>%
mutate(fit=map(data, deplet(catch=BF_AYAs_count,effort=BF_noT_effort, method="l")),
results = l.out$results) %>%
unnest()
我将通过说我从未使用过fishmethods包或deplet()函数作为开头。我认为问题是我无法将deplet()的结果分配给对象(即x
如果您愿意,可能的替代建议是仅使用for循环并分别构建结果列表,然后将整个列表突变为嵌套数据框:
#nest the count and effort data
bf_AYA_popest <- b %>%
nest(data = c(BF_AYAs_count, BF_noT_effort))
#create an empty list to store results
results_list <- vector("list")
#loop through rows of nested dataframes giving the data to deplete
for(i in 1:nrow(bf_AYA_popest)){
deplet(catch = bf_AYA_popest$data[[i]]$BF_AYAs_count,
effort = bf_AYA_popest$data[[i]]$BF_noT_effort,
method ="l")
#each time deplet runs it makes an l.out
results_list[[i]] <- l.out$results #catch the ouput and store in list
#the next run through l.out is overwrritten
}
#add the list asa column to the original nested df
bf_AYA_popest <- bf_AYA_popest %>%
mutate(fit = results_list)