【发布时间】:2020-03-17 18:09:37
【问题描述】:
我正在尝试从化学式中提取碳、氢和氧的数量。我之前发现了一些我一直在尝试使用的代码。问题是代码仅在化学式中包含超过 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] 来获取感兴趣的列.
【问题讨论】:
-
是否是单个字符串。请显示预期输出
-
不,我正在从包含其他信息的 data.frame 中提取公式。所以这是我感兴趣的一个专栏。
-
你能更新预期的输出吗?你得到的价值观对我来说似乎是正确的
-
我用期望的结果更新了帖子。目前结果对于我正在使用的代码是正确的,只是希望改进它以取消手动检查 0 值。
-
能否请您以有效的 R 语法提供示例输入?像
V = data.frame(val = c("CH4O", "H2O", "C10H18O2"))这样的东西,如果这确实是V的样子?我很惊讶,因为你说V是一个数据框,但是你在代码中使用V就好像它是一个向量一样。除了阐明您的数据结构之外,它还可以为每个人提供一组标准的输入进行测试,这往往会大大加快人们回答并确保结果正确的速度。