如何使用 R 中的 eval-parse 计算方程?

How to calculate an equation using eval-parse in R?

如何在 R 中使用 eval parse 计算方程的值?等式中每个分量的值应取自同一行中同名列,例如'alpha' 来自 'alpha' 列,依此类推。

数据框:

dput(<alpha beta    gamma   delta   epsilon zeta    eta theta   RF  min.speed.kph   max.speed.kph   speed   equation
9.70E-05    0.0026  1.432   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
7.40E-05    0.013   1.484   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
0.000266    -0.014  2.427   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
2.88E-12    2.56E-10    -2.09E-07   7.75E-05    -0.005274381    0.152658622 0   0.88    NA  10  140 30  ((alpha*speed^5)+beta*speed^4+gamma*speed^3+delta*speed^2+epsilon*speed+zeta)*(theta)
2.88E-12    2.56E-10    -2.09E-07   7.75E-05    -0.005274381    0.152658622 0   0.6 NA  10  140 30  ((alpha*speed^5)+beta*speed^4+gamma*speed^3+delta*speed^2+epsilon*speed+zeta)*(theta)
0.524738843 0   -0.01   0   9.36E-05    0   0   0   0   5   130 30  ((alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2))*(1-RF)
0.283553945 -0.0234 -0.00869    0.000443    0.000114    0   0   0   0   5   130 30  ((alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2))*(1-RF)
0.189162424 1.571506423 0.081547506 0.027327758 -0.000248892    -0.268467236    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)
0.474232144 5.621746462 0.340577763 0.083762882 -0.001515827    -1.191086695    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)
0.189162424 1.571506423 0.081547506 0.027327758 -0.000248892    -0.268467236    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)
>)

我已经试过了,但没用:

nox.file$calculated_col <- eval(parse(text=as.character(nox.file$equation)), nox.file)

我也试过将它包装在 'mutate' 中以帮助对其进行矢量化,但这也不起作用:

nox.file <- nox.file %>% mutate(calculated_col=eval(parse(text=as.character(equation)), nox.file))

谁能告诉我怎么了?

您尝试的问题是 eval 未矢量化。它只计算表达式向量 parse(text = equation) 的最后一个元素。你可以尝试这样的事情:

library("dplyr")

dd <- nox.file %>% 
    group_by(equation) %>%
    ## mutate(calculated_col = eval(str2lang(cur_group()[[1L]])))
    mutate(calculated_col = tryCatch(eval(str2lang(cur_group()[[1L]])), error = function(e) NA_real_))

dd$calculated_col
## [1] 1.59730000 1.94060000 2.24640000 0.05175415 0.03528692
## [6] 0.30897884 0.18006882 0.03303038 0.03790261 0.03303038

我从你的复制和粘贴中重建了 nox.file,如下所示:

x <- "alpha beta    gamma   delta   epsilon zeta    eta theta   RF  min.speed.kph   max.speed.kph   speed   equation
9.70E-05    0.0026  1.432   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
7.40E-05    0.013   1.484   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
0.000266    -0.014  2.427   0   0   0   0   0   0   10  130 30  ((alpha*speed^2)+(beta*speed)+gamma+(delta*log10(speed))+(epsilon*exp(zeta*speed))+(eta*(speed^theta)))*(1-RF)
2.88E-12    2.56E-10    -2.09E-07   7.75E-05    -0.005274381    0.152658622 0   0.88    NA  10  140 30  ((alpha*speed^5)+beta*speed^4+gamma*speed^3+delta*speed^2+epsilon*speed+zeta)*(theta)
2.88E-12    2.56E-10    -2.09E-07   7.75E-05    -0.005274381    0.152658622 0   0.6 NA  10  140 30  ((alpha*speed^5)+beta*speed^4+gamma*speed^3+delta*speed^2+epsilon*speed+zeta)*(theta)
0.524738843 0   -0.01   0   9.36E-05    0   0   0   0   5   130 30  ((alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2))*(1-RF)
0.283553945 -0.0234 -0.00869    0.000443    0.000114    0   0   0   0   5   130 30  ((alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2))*(1-RF)
0.189162424 1.571506423 0.081547506 0.027327758 -0.000248892    -0.268467236    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)
0.474232144 5.621746462 0.340577763 0.083762882 -0.001515827    -1.191086695    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)
0.189162424 1.571506423 0.081547506 0.027327758 -0.000248892    -0.268467236    0   0   0   5   130 30  (alpha+gamma*speed+epsilon*speed^2+zeta/speed)/(1+beta*speed+delta*speed^2)"

con <- textConnection(x)
nox.file <- read.table(con, header = TRUE)
close(con)

重建可能不准确,这就是为什么我们鼓励您在问题中包含适当的 dput 输出。

您还可以这样做:

df %>% 
   rowwise() %>%
   mutate(sol = eval(parse(text = equation)))