r - 使用 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.formula
andpaste
函数来完成这个,但我在这里也遇到了困难。任何投入将不胜感激。此外,我将不得不将此函数与产品的类似方程连接/组合,并将所有这些包含在 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 = " + ")
笔记
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)
推荐阅读
- sql - 以更简单的方式重写长 T-SQL 查询 (SQL Server 2016)
- vue.js - 如何将一个输入与另一个相关联(改变一个也改变另一个)
- typescript - 如何在 Angular 11 中向 ul li 添加类名
- sql-server - 如何更新 SSIS 数据流任务中的下游组件?
- c - 如何在 C 中正确使用 setvbuf?
- spring-boot - 在 Angular8 代码中安全地放置凭据(用户名和密码)以访问受保护的 SpringBoot Rest API
- android - 离线应用的全文搜索实现
- angular - 当我尝试在角度库中使用 ngx-translate 时出错
- gatsby - 我可以将参数从 js / tsx 文件中的页面传递到 gatsby-node.js 中的 onCreatePage 函数吗?
- asp.net - 将 system.web.dll 中的 debug.trace 消息写入文件