使用 OPTIM() 将附加列变异为现有数据框或 tibble

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

我想通过改变 OPTIM() 函数的优化结果来向现有数据框添加一个额外的列。当我将数据帧剥离到 1 行时代码有效,但当有 2 行时出现以下错误:

optim()
错误导致: ! optim 中的目标函数的计算结果为长度 2 而不是 1


library(tidyverse)
library(dbplyr)


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

#################################
####   If I create dataframe A with a single row, the code works, but fails when there are 2 rows ####

# A <- data.frame(ID = c("A1")
#                 , U = c(28844)
#                 , D = c(0.7941582)
#                 , U2 = c(3417)
#                 , U3 = c(2465)
#                 )
#################################

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



A2 <- mutate(A
             , C = optim(par = 1.1
                          , hfcn
                          , D = A$D
                          , U = A$U
                          , U2 = A$U2
                          , U3 = A$U3
                          , method = "BFGS"
                          #, method = "L-BFGS-B"#, lower = 0, upper = 3
                        )[1]
             )

mutate()
中的错误: !计算
C = ...[]
时出现问题。
optim()
错误导致: ! optim 中的目标函数的计算结果为长度 2 而不是 1 回溯:

  1. dplyr::变异(...)
  2. 统计::优化(...)

当我将数据库限制为单行时,我已经成功运行了代码。我可以通过函数独立运行两行,并使用 OPTIM() 改变和附加列,以便检查代码和函数输入。我怀疑我可能必须使用 purrr 的功能,但我在网上找不到任何可以帮助我解决这个问题的东西。

dataframe function purrr sapply optim
1个回答
0
投票

简答

您需要将这些值逐行传递给

optim
而不是整个向量:

A2 <- A %>% 
  rowwise() %>% 
  mutate(C = optim(par = 1.1
                   , hfcn
                   , D = D
                   , U = U
                   , U2 = U2
                   , U3 = U3
                   , method = "BFGS"
                   #, method = "L-BFGS-B"#, lower = 0, upper = 3
  )[1]
  ) %>% 
  ungroup()

注意,在 tidyverse 中,当您引用一个变量时,您不需要使用

$
,因为引用被理解为来自数据框,除非另有说明。

© www.soinside.com 2019 - 2024. All rights reserved.