如何解析化学式以获得原子成分?

jan*_*anb 4 r chemistry

我的数据集存储在名为“Formula”的单列表中,如下所示:

row.identity..main.ID.
C5H6O2N3
C10H12N
C5H6O2N3S
Run Code Online (Sandbox Code Playgroud)

我想扩展当前表格,其中在每一列中写入字母并在相应数字下方的行中显示。基本上我想要这样的东西:

row.identity..main.ID.   C  H  O  N  S  X
C5H6O2N3                 5  6  2  3  0  0   
C10H12N                 10 12  0  1  0  0
C5H6O2N3S                5  6  2  3  1  0
Run Code Online (Sandbox Code Playgroud)

如果代码可以灵活处理带有不同字母的更长数据集,那就太好了。到目前为止,我尝试实施 Onyambu 的解决方案。

library(tidyverse)
library(stringr)    
Formula%>%mutate(row.identity..main.ID.=gsub("\\b([A-Za-z]+)\\b","\\30",row.identity..main.ID.),
               elements=str_extract_all(row.identity..main.ID.,"[A-Za-z]+"),
               value=str_extract_all(row.identity..main.ID.,"\\d+"))%>%
          unnest()%>%pivot_wider(elements,value,fill=0)
Run Code Online (Sandbox Code Playgroud)

然而,这会导致一些错误,例如“不兼容的长度:4、3”。和/或cols现在在使用 unnest() 时需要。

Ony*_*mbu 5

你也可以这样做:

a<- sub("([A-Z]$)","\\1:1", gsub("(\\D+)(\\d+)", "\\1:\\2\n",df[,1]))
e <- sapply(a, function(x)data.frame(read.dcf(textConnection(x))))
f <- cbind(df, plyr::rbind.fill(e))
f[is.na(f)] <- 0
f

  row.identity..main.ID.  C  H O N S
1               C5H6O2N3  5  6 2 3 0
2                C10H12N 10 12 0 1 0
3              C5H6O2N3S  5  6 2 3 1
Run Code Online (Sandbox Code Playgroud)

另一种选择是将文本转换为 Json,然后将其读入 R:

a <- gsub("(\\D)(\\d+)", '"\\1":\\2,', df[,1])
b <- gsub("([A-Z])$", '"\\1":1', trimws(a, whitespace = ","))

cbind(df, jsonlite::fromJSON(sprintf("[{%s}]",paste(b, collapse = "}, {"))))
replace(f, is.na(f), 0)

  row.identity..main.ID.  C  H O N S
1               C5H6O2N3  5  6 2 3 0
2                C10H12N 10 12 0 1 0
3              C5H6O2N3S  5  6 2 3 1
Run Code Online (Sandbox Code Playgroud)