使用optim()结合mutate为数据框新增列时多行报错求助
问题:批量使用
optim()优化时出现长度不匹配错误 当尝试用mutate()给多行数据框新增列,列值为optim()的优化结果时,单行数据可正常运行,多行则报错:
Error in
mutate():
! Problem while computingC = ...[].
Caused by error inoptim():
! objective function in optim evaluates to length 2 not 1
错误原因
直接在optim()中传入数据框整列(如A$D)会让目标函数hfcn一次性处理所有行的数据,返回长度与数据行数一致的结果,但optim()要求目标函数每次只能返回单个数值(对应一组参数的优化目标值),因此触发长度不匹配错误。
解决方案
使用purrr::pmap()逐行处理数据,确保每次optim()仅接收单组参数:
library(tidyverse) # 保留原目标函数不变 hfcn <- function(b, D, U, U2, U3){ Din = ((1 - D)^-b - 1) / b rsd_2 = ((U / (1 + b*Din*2)^(1/b) - U2)^2)^0.5 rsd_3 = ((U / (1 + b*Din*3)^(1/b) - U3)^2)^0.5 rst_tot = rsd_2 + rsd_3 return(rst_tot) } # 原数据框 A <- data.frame(ID = c("A1", "A2") , U = c(72625, 28844) , D = c(0.7785440, 0.7941582) , U2 = c(7916, 3417) , U3 = c(5409, 2465) ) # 逐行调用optim,提取优化后的par值作为新增列 A2 <- A %>% mutate(C = pmap(list(D, U, U2, U3), function(d, u, u2, u3) { optim(par = 1.1, fn = hfcn, D = d, U = u, U2 = u2, U3 = u3, method = "BFGS")$par })) # 若需保留完整optim结果(如目标函数值、收敛状态等),可去掉$par: # A2 <- A %>% # mutate(C = pmap(list(D, U, U2, U3), function(d, u, u2, u3) { # optim(par = 1.1, # fn = hfcn, # D = d, # U = u, # U2 = u2, # U3 = u3, # method = "BFGS") # }))
说明
pmap()会遍历数据框的每一行,将该行的D、U、U2、U3作为单个值传入匿名函数,再由匿名函数传递给optim(),确保每次优化仅处理单组数据。- 代码中
$par用于提取优化后的参数值,若需要完整的优化结果对象,删除该部分即可,此时新增列C会存储包含所有优化信息的列表。
内容的提问来源于stack exchange,提问作者Mel Sorrell
相关产品推荐
相关产品推荐

