从字符串中提取三个数字(缺少数字?)

时间:2017-01-25 13:04:48

标签: r regex

我已经从SO中获利,现在已经有一段时间了,现在决定注册并尝试a)帮助他人和b)从伟人那里获得帮助:))

所以我的问题是,我从一个看起来像这样的数据框中提取了向量(只是数据的一小部分):

cho <- c("[M-H]: C4H4O2", 
"[M+Hac-H]: C5H10O6",
"[M-H]: C6H4O3",
"[M+Fa-H]: C7H6O",
"[M-H]: C9H8O3",
"[M-H]: C18H30O3);

现在从这个向量中我想提取数字以获得&#34; C&#34;,&#34; H&#34;和&#34; O&#34;原子:

temp <- strsplit(cho, "[^[:digit:]]");
temp <- as.numeric(unlist(temp));

#remove NAs
temp <- temp[!is.na(temp)];

#split into three column matrix and convert to df to merge with original df
temp <- as.data.frame(matrix(temp, ncol = 3, byrow = T));

在这种情况下,R正在循环数据以生成矩阵,在我的情况下,对于更大的数据集,生成的temp向量足够长并且矩阵正在生成,但它是一团糟;这是由"[M+Fa-H]: C7H6O"之类的情况引起的,其中只能提取两个数字;怎么可能得到一个&#34; 1&#34;在&#34; O&#34;之后这样可以提取三个数而不是两个?有解决方法吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我们可以使用str_extract_all。使用正则表达式外观匹配\\d+CH后面的一个或多个数字(O),在list中提取这些数字,并转换为integer

library(stringr)
lst <- lapply(str_extract_all(cho, "(?<=C|H|O)\\d+"), as.integer)

base R选项

read.csv(text=sub(".*C?(\\d+)H?(\\d+)O?(\\d*).*", 
              "\\1,\\2,\\3", cho), header=FALSE, fill=TRUE)