首页 > 解决方案 > 使用 R 中的非数字参数从数据框中创建公式

问题描述

我正在尝试从数据框中的变量列表创建一个公式,我最终将从以下数据输入 ODE 求解器:

+--------+--------+--------+---------+-------+-------+----------+
| React1 | React2 | React3 |  Prod1  | Prod2 | Prod3 |    k     |
+--------+--------+--------+---------+-------+-------+----------+
| $OH    | $OH    | NA     | H2O2    | NA    | NA    | 5.50E+09 |
| $OH    | $HO2   | NA     | H2O     | O2    | NA    | 7.10E+09 |
| $OH    | $O2    | NA     | OH      | O2    | NA    | 1.00E+10 |
| H2O2   | $OH    | NA     | $HO2    | H2O   | NA    | 2.70E+07 |
| $OH    | HCO3   | NA     | $CO3    | NA    | NA    | 8.50E+06 |
| $OH    | CO2    | NA     | $CO3    | NA    | NA    | 1.00E+06 |
| $OH    | CO3    | NA     | $CO3    | OH    | NA    | 3.90E+08 |
| $OH    | $CO3   | NA     | unknown | NA    | NA    | 3.00E+09 |
| Cl     | $OH    | NA     | $ClOH   | NA    | NA    | 4.30E+09 |
| $Cl2   | $OH    | NA     | HOCl    | Cl    | NA    | 1.00E+09 |
| HOCl   | $OH    | NA     | $ClO    | H2O   | NA    | 2.00E+09 |
| ClO    | $OH    | NA     | $ClO    | OH    | NA    | 8.80E+00 |
+--------+--------+--------+---------+-------+-------+----------+

目标是从这个数据框中得到一个方程,它将每一列的 React1、React2、React3 和 k 相乘,然后将整列相加(类似于 excel 中的 SUMPRODUCT)。例如:

分母总和 = 5.5E9*$OH*$OH + 7.1E9*$OH*$HO2 + ... 8.8E0*CLO*$OH

我尝试了以下代码,但它不起作用,因为我试图将二进制运算符应用于非数字参数。

Reactants <- Reactants %>% mutate(
  Sum = apply( Reactants, MARGIN = 1, Multiplication(React1,React2,React3,k), na.rm = TRUE)
)

我的问题是最好的方法是什么?我有一种感觉,我可以使用as.formulaandpaste函数来完成这个,但我在这里也遇到了困难。任何投入将不胜感激。此外,我将不得不将此函数与产品的类似方程连接/组合,并将所有这些包含在 for 循环中。

标签: rvariablesformulaapply

解决方案


使用DF最后注释中定义的,apply与指示的函数一起使用,然后将其元素粘贴在一起。

nms <- grep("^React|^k$", names(DF), value = TRUE)
Prod <- function(x) paste(sub("^(\\$.*)$", "`\\1`", na.omit(x)), collapse = "*")
paste(apply(DF[nms], 1, Prod), collapse = " + ")

笔记

Lines <- "React1 | React2 | React3 |  Prod1  | Prod2 | Prod3 |    k

 $OH    | $OH    | NA     | H2O2    | NA    | NA    | 5.50E+09
 $OH    | $HO2   | NA     | H2O     | O2    | NA    | 7.10E+09
 $OH    | $O2    | NA     | OH      | O2    | NA    | 1.00E+10
 H2O2   | $OH    | NA     | $HO2    | H2O   | NA    | 2.70E+07
 $OH    | HCO3   | NA     | $CO3    | NA    | NA    | 8.50E+06
 $OH    | CO2    | NA     | $CO3    | NA    | NA    | 1.00E+06
 $OH    | CO3    | NA     | $CO3    | OH    | NA    | 3.90E+08
 $OH    | $CO3   | NA     | unknown | NA    | NA    | 3.00E+09
 Cl     | $OH    | NA     | $ClOH   | NA    | NA    | 4.30E+09
 $Cl2   | $OH    | NA     | HOCl    | Cl    | NA    | 1.00E+09
 HOCl   | $OH    | NA     | $ClO    | H2O   | NA    | 2.00E+09
 ClO    | $OH    | NA     | $ClO    | OH    | NA    | 8.80E+00"
DF <- read.table(text = Lines, header = TRUE, sep = "|", strip.white = TRUE,
 as.is = TRUE)

推荐阅读