首页 > 解决方案 > 从 R 中的化学式中提取数字(缺少 1 的数字)

问题描述

虽然我在“从 R 中的化学式中提取数字”中尝试了@Onyambu 的答案,但新问题来了。参考代码如下,

library(tidyverse)
library(stringr)  



dat%>%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)
   m.z Intensity Relative Delta..ppm. RDB.equiv.    Composition  C  H Na O
1 149.0233   4083459    23.60       -0.08        6.5       C8 H5 O3  8  5  0 3
2 279.1591        NA    18.64       -0.03        5.5     C16 H23 O4 16 23  0 4
3 301.1409        NA   100.00       -0.34        5.5 C16 H22 O4 Na1 16 22  1 4

例如。我的问题是如何处理这样的公式,“C7H5NO4”?我只得到了 ("C" "H" "NO") 和 ("7" "5" "4"); 正确的形式是 ("C" "H" "N","O") 和 ("7" "5" ,"1","4")。

如果我们能插入1“N”和“O”,问题可能就解决了。我不知道如何处理它。

谢谢

嘻嘻

标签: rformulastringr

解决方案


根据您的其他问题,如何:

library(tidyverse)
library(tidytext)
df %>% 
  unnest_tokens(part, Composition, to_lower = FALSE) %>%
  mutate(col = str_extract(part, "[A-z]+"),
         val = as.integer(str_extract(part, "\\d+"))) %>% 
  select(-part) %>% 
  mutate(val = ifelse(is.na(val), 1, val)) %>% 
  pivot_wider(names_from = col, 
              values_from  = val, 
              values_fill = 0)
#> # A tibble: 3 x 9
#>     m.z Intensity Relative Delta..ppm. RDB.equiv.     C     H     O    Na
#>   <dbl>     <dbl>    <dbl>       <dbl>      <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  301.       NA     100         -0.34        5.5    16    22     4     1
#> 2  149.  4083458.     23.6       -0.08        6.5     8     5     3     0
#> 3  279.       NA      18.6       -0.03        5.5    16    23     4     0

这利用了合成中项目之间的空间。unnest_tokensfromtidytext在我们将它们分成不同的列之前将它们分成新的行。


推荐阅读