【问题标题】:How do you extract the number of each element in a chemical formula, with parentheses, and create them into columns?如何用括号提取化学式中每个元素的数量,并将它们创建成列?
【发布时间】:2019-07-12 00:22:49
【问题描述】:

您好,我正在尝试从化学式中提取一些信息并将它们添加到 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' 列及其对应的编号。

【问题讨论】:

  • 欢迎来到堆栈!最好能包含reproducible example。您能做到dput(head(dataframe))(假设dataframe 是您的数据框的实际名称)并将其包含在您上面的问题中,这将帮助其他人测试他们的答案并向您展示结果。

标签: r regex formula


【解决方案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

【讨论】:

  • 您好,感谢您这么快就回来了!所以我实际上希望有一行在列中提供以下信息 -> "Composition", "C", "[13]C", "H", "O" 。这可能吗?这是我第一次使用 R,所以我没有经过任何培训就被扔进了循环中。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 2021-06-03
  • 2019-04-14
  • 2021-10-16
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多