使用R中的非数值参数从数据帧创建公式

使用R中的非数值参数从数据帧创建公式,r,variables,formula,apply,R,Variables,Formula,Apply,我试图从数据帧中的变量列表创建一个公式,最终将从以下数据输入ODE解算器: +--------+--------+--------+---------+-------+-------+----------+ | React1 | React2 | React3 | Prod1 | Prod2 | Prod3 | k | +--------+--------+--------+---------+-------+-------+----------+ | $OH | $OH

我试图从数据帧中的变量列表创建一个公式,最终将从以下数据输入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)
)
反应物%突变(
总和=应用(反应物,裕度=1,乘法(反应1,反应2,反应3,k),na.rm=真)
)

我的问题是什么是最好的方法?我有一种感觉,我可能能够使用
as.formula
paste
函数来实现这一点,但我在这里也遇到了困难。如有任何意见,将不胜感激。此外,我必须将此函数与产品的类似方程式连接/组合,并将所有这些合并到一个for循环中。

使用最后注释中定义的
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 = " + ")

nms使用末尾注释中定义的
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 = " + ")

nms嘿,我想在dput function Lable=c中发布一个问题(对于4行4列来说非常大。你知道问题是什么吗?我是指dput functionstructure(list)(SAMPN=structure)(c(4L,4L,4L,17L,28L),.Label=c(“4”,“8”,“9”,“19”,“21”,“26”,“27”,“40”,“47”,“51”),“53”“60”“64”“69”“73”“74”“78”“82”“83”“84”“87”“89”“92”“94”“96”“98”“100”“102”“104”“106”“115”“118”“119”“120”“127”“129”“135”“138”“139”“140”“141”“142”“144”“145”“149”“您可以使用
dput(head(DF))
dput(head(DF,k))
其中
k
是要使用的行数。@hghg,如果您现在有答案,我建议您删除您的注释,以免劫持与答案相关的注释。嘿,我正试图在dput function Lable=c中发布一个问题(对于4行4列来说非常大。你知道问题出在哪里吗?我是指dput functionstructure(列表(SAMPN=structure)(c(4L,4L,4L,17L,28L),.Label=c(“4”,“8”,“9”,“19”,“21”,“26”,“27”,“40”,“47”,“51”,“53”,“60”,“64”,“69”,“73”,“74”,“78”,“82”),“83”“84”“87”“89”“92”“94”“96”“98”“100”“102”“104”“106”“115”“118”“119”“120”“127”“129”“135”“138”“139”“140”“141”“142”“144”“145”“149”“您可以使用
dput(head(DF))
dput(head(DF,k))
其中
k
是要使用的行数。@hghg,如果您现在有答案,我建议您删除您的注释,以免劫持所有与答案相关的注释。我们是否假设“单元格”都有数值?放入“$OH”然后有一个乘积也是一个字符值,这让我觉得你需要某种符号操作。嘿,42,所有的单元格都应该是非数值变量,我将对它们执行二进制运算来生成一个公式。我们应该假设“单元格”都有数值吗?把“$OH”然后有一个乘积也是一个字符值,这让我觉得你需要某种符号操作。嘿,42,所有的单元格都应该是非数值变量,我将对其执行二进制操作,以生成一个公式。