在需要列规范的函数上使用purrr::map

在需要列规范的函数上使用purrr::map,r,purrr,R,Purrr,我想使用purr::map()运行一个预先打包的函数fishmethods::depent 数据集有多年(见下面的示例),我需要每年分别拟合模型 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.343750000

我想使用purr::map()运行一个预先打包的函数fishmethods::depent

数据集有多年(见下面的示例),我需要每年分别拟合模型

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"))

更新 为了解决depent()无法将depent的结果分配给对象的问题,我们可以将depent包装在我们自己的函数中,该函数实际上会将它始终创建的l.out对象返回给我们创建的对象。然后,我们可以根据您最初的需要对新的消耗进行变异和映射:

deplet2 <- function(...){
  deplet(...)
  return(l.out)
}

bf_AYA_popest <- b %>% 
  nest(data = c(BF_AYAs_count, BF_noT_effort)) %>% 
  mutate(fit = map(data, ~deplet2(catch = .$BF_AYAs_count,
                                 effort = .$BF_noT_effort,
                                 method ="l")),
         results = map(fit, "results"))
2%
变异(拟合=映射(数据,~2消耗(捕获=.$BF_-AYAs_计数),
努力=.$BF\u非努力,
方法(l),
结果=映射(拟合,“结果”))
旧的 在开始之前,我会说我从来没有使用过fishmethods包或depent()函数。我认为问题在于我无法将耗尽()的结果分配给对象(即xUPDATE 为了解决耗尽()无法将耗尽结果分配给对象的问题,我们可以将耗尽包装在我们自己的函数中,该函数实际上会将它始终创建的l.out对象返回给我们创建的对象。然后我们可以根据您最初的需要对新的耗尽进行变异和映射:

deplet2 <- function(...){
  deplet(...)
  return(l.out)
}

bf_AYA_popest <- b %>% 
  nest(data = c(BF_AYAs_count, BF_noT_effort)) %>% 
  mutate(fit = map(data, ~deplet2(catch = .$BF_AYAs_count,
                                 effort = .$BF_noT_effort,
                                 method ="l")),
         results = map(fit, "results"))
2%
变异(拟合=映射(数据,~2消耗(捕获=.$BF_-AYAs_计数),
努力=.$BF\u非努力,
方法(l),
结果=映射(拟合,“结果”))
旧的
首先,我要说,我从未使用过fishmethods包或depent()函数。我认为问题在于我无法将depent()的结果分配给对象(即x,谢谢,更新非常有用,解决了我的问题。我假设“嵌套”按年份嵌套,因为它是df中唯一剩余的列,一旦其他列被分配给“data”。对于可能从fishmethods中应用相同函数的任何人,请注意——请确保更新包装函数中的“METHOD.out”以匹配在dreat()中应用的方法——我提供的示例代码使用“l”方法,但输出名称随方法而更改,例如method=“ml”output=ml.out。谢谢,更新非常有用,解决了我的问题。我假设“nest”按年嵌套,因为它是df中唯一剩余的列,一旦其他列分配给“data”。对于可能从fishmethods中应用相同函数的任何人,请注意--请确保更新包装函数中的“METHOD.out”以匹配在dreat()中应用的方法--我提供的示例代码使用“l”方法,但输出名称随方法而变,例如METHOD=“ml”output=ml.out。
#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 as a  column to the original nested df
bf_AYA_popest <- bf_AYA_popest %>% 
  mutate(fit = results_list)
bf_AYA_popest <- b %>% 
  nest(data = c(BF_AYAs_count, BF_noT_effort)) %>% 
  mutate(fit = map(data, ~deplet(catch = .$BF_AYAs_count,
                                 effort = .$BF_noT_effort,
                                 method ="l")))
# A tibble: 2 x 3
   Year data             fit   
  <dbl> <list>           <list>
1  2012 <tibble [4 × 2]> <NULL>
2  2015 <tibble [4 × 2]> <NULL>