使用R中的非数值参数从数据帧创建公式
我试图从数据帧中的变量列表创建一个公式,最终将从以下数据输入ODE解算器:使用R中的非数值参数从数据帧创建公式,r,variables,formula,apply,R,Variables,Formula,Apply,我试图从数据帧中的变量列表创建一个公式,最终将从以下数据输入ODE解算器: +--------+--------+--------+---------+-------+-------+----------+ | React1 | React2 | React3 | Prod1 | Prod2 | Prod3 | k | +--------+--------+--------+---------+-------+-------+----------+ | $OH | $OH
+--------+--------+--------+---------+-------+-------+----------+
| 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,所有的单元格都应该是非数值变量,我将对其执行二进制操作,以生成一个公式。