如何使用 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)))
如何在 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)))