Я пытаюсь извлечь количество атомов углерода, водорода и кислорода из химической формулы. Ранее я нашел некоторый код, который я пытался использовать. Проблема в том, что код работает только тогда, когда химическая формула содержит более 1 элемента.
V <- DATA # example: CH4O, H2O, C10H18O2
# V is a data.frame
C1 <- as.integer(sub("(?i).*?C:?\\s*(\\d+).*", "\\1", V))
# NA NA 10
H1 <- as.integer(sub("(?i).*?H:?\\s*(\\d+).*", "\\1", V))
# 4 2 18
O1 <- as.integer(sub("(?i).*?O:?\\s*(\\d+).*", "\\1", V))
# NA NA 2
В настоящее время я использую is.na(C1) <- 1
, чтобы изменить NA на 1, а затем вручную изменить значения 0. Есть ли более эффективный код, который я могу использовать, чтобы получить правильное количество элементов в химических формулах (особенно в случаях, когда значение равно 0 или 1 и приводит к результатам NA). Дайте мне знать, если вам нужна дополнительная информация или мне следует изменить какой-либо формат.
РЕДАКТИРОВАТЬ: Желаемые значения будут состоять в том, чтобы получить все правильные значения без NA и вручную изменить значения на 0, если это возможно.
C1
# 1 0 10
H1
# 4 2 18
O1
# 1 1 2
РЕДАКТИРОВАТЬ2: Вот пример фактических данных, которые я импортирую
Meas. m/z # Ion Formula Score m/z err [mDa] err [ppm] mSigma rdb e¯ Conf Adduct
84.080700 1 C5H10N n.a. 84.080776 0.1 0.9 n.a. 2.0 even
89.060100 1 C4H9O2 n.a. 89.059706 -0.4 -4.4 n.a. 1.0 even
131.987800 1 C2H4N3P2 n.a. 131.987498 -0.3 -2.3 n.a. 6.0 even
135.081100 1 C9H11O n.a. 135.080441 -0.7 -4.9 n.a. 5.0 even
135.117500 1 C10H15 n.a. 135.116827 -0.7 -5.0 n.a. 4.0 even
136.061700 1 C5H6N5 n.a. 136.061772 0.1 0.5 n.a. 6.0 even
В первоначальном вопросе я только перечислил V
как происходящий из вектора формул, но что У меня фактически есть data.frame с другой информацией, и я использую V[,3]
при выполнении вычислений, чтобы получить интересующий столбец.