我已经从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;之后这样可以提取三个数而不是两个?有解决方法吗?
非常感谢您的帮助!
答案 0 :(得分:2)
我们可以使用str_extract_all
。使用正则表达式外观匹配\\d+
或C
或H
后面的一个或多个数字(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)