You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用optim()结合mutate为数据框新增列时多行报错求助

问题:批量使用optim()优化时出现长度不匹配错误

当尝试用mutate()给多行数据框新增列,列值为optim()的优化结果时,单行数据可正常运行,多行则报错:

Error in mutate():
! Problem while computing C = ...[].
Caused by error in optim():
! 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:17:14