在需要列指定的函数上使用purrr :: map

问题描述 投票:1回答:1

我想使用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()

r purrr
1个回答
0
投票

我将通过说我从未使用过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)
© www.soinside.com 2019 - 2024. All rights reserved.