r - 如何用括号提取化学式中每个元素的数量,并将它们创建成列?
问题描述
嗨,我正在尝试从化学公式中提取一些信息并将它们添加到 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”列来划分元素及其对应的编号。
解决方案
以下正则表达式应提取同位素数、元素和原子数。
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
推荐阅读
- javascript - 在普通 TypeScript 文件中导入 Vue 组件失败
- android-studio - 我在哪里可以找到 Activity_Main 的文本视图?
- python - 创建df列作为行的json
- c# - XML 反序列化为已知类型,其中一个元素的结构是可变的(在 SOAP 服务参考中)
- python - 使用 dask-jobqueue 时,SLURM 批处理文件仍需要 #SBATCH 调用资源分配吗?
- angular - 来自 Json 的 Angular 中的动态路由
- javascript - 使用 jQuery 通过 AJAX POST 传递数组
- apache-spark - 错误:无法在 Spark+Mesos 集群上加载类
- python - 尝试使用 Python 删除文件,但权限错误表明它们正被另一个进程使用
- python - 如何获得Python中每一行的下n行的平均值