Как извлечь номер каждого элемента в химической формуле с круглыми скобками и создать их в столбцах? - PullRequest
0 голосов
/ 12 июля 2019

Привет. Я пытаюсь извлечь некоторую информацию из химической формулы и добавить ее в уже существующую таблицу на 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 'и соответствующий им номер.

1 Ответ

1 голос
/ 12 июля 2019

Следующее регулярное выражение должно извлекать номер изотопа, элемент и количество атомов.

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
...