Создание формулы из фрейма данных с использованием нечисловых аргументов в R - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать формулу из списка переменных в кадре данных, который в конечном итоге я буду вводить в решатель 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 из каждого столбца вместе, а затем суммирует весь этот столбец вместе (аналогично SUMPRODUCT в excel).Например:

Сумма знаменателя = 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 и paste, но и здесь я сталкиваюсь с трудностями.Любой вклад будет принята с благодарностью.Более того, мне нужно будет объединить / объединить эту функцию с аналогичным уравнением для продуктов и включить все это в цикл for.

1 Ответ

2 голосов
/ 20 сентября 2019

Используя 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)
...