嗨,我正在尝试从化学式中提取一些信息,并将其添加到r上预先存在的表格中。目前,我有一列具有化学式所示的列(C4H8O2)。我没有问题提取每个元素及其对应的数字。但是,当公式中包含方括号时,例如C3 [13] C1H8O2,我遇到了问题。我希望标题说13 [C],输入为1。但是我的代码无法识别“ [13] C1”,所以给我一个错误。
任何建议都会很棒。
#First manipuation - extracting information out of the "Composition" column, into seperated columns for each element
data2 <- dataframe%>%mutate(Composition=gsub("\\b([A-Za-z]+)\\b","\\11",Composition),
name=str_extract_all(Composition,"[A-Za-z]+"),
value=str_extract_all(Composition,"\\d+"))%>%
unnest()%>%spread(name,value,fill=0)
我已经有一个预制的csv文件,该文件将表组织了起来,并将其放入了数据框,因此现在我只想用'C'列和'[13]删除元素。 C'列及其对应的编号。
答案 0 :(得分:1)
以下正则表达式应提取同位素数,元素和原子数。
library(stringr)
str_match_all( "C3[13]C1H8O2", "(\\[[0-9]+\\])?([A-Za-z]+)([0-9]+)" )
## [[1]]
## [,1] [,2] [,3] [,4]
## [1,] "C3" NA "C" "3"
## [2,] "[13]C1" "[13]" "C" "1"
## [3,] "H8" NA "H" "8"
## [4,] "O2" NA "O" "2"
带有data.frame:
library(tidyr)
library(dplyr)
d <- data.frame( Composition = c( "H2O1", "C3[13]C1H8O2" ) )
pattern <- "(\\[[0-9]+\\])?([A-Za-z]+)([0-9]+)"
d %>%
mutate( Details = lapply( str_match_all( Composition, pattern ), as.data.frame ) ) %>%
unnest() %>%
transmute(
Composition,
element = paste0( ifelse(is.na(V2),"",V2), V3 ),
number = V4
) %>%
spread(key="element", value="number") %>%
replace(., is.na(.), 0)
## Composition [13]C C H O
## 1 C3[13]C1H8O2 1 3 8 2
## 2 H2O1 0 0 2 1