【问题标题】:How do I split strings into number and the remaining string using stringr in r?如何在 r 中使用 stringr 将字符串拆分为数字和剩余的字符串?
【发布时间】:2018-02-02 09:23:24
【问题描述】:

我想使用 stringr 在我的数据框中拆分字符串。

以下是我的数据框:

df<-data.frame(ID = 1:26, 
           DRUG_STRENGTH = c("50 MG", "1250 MG", "20 MG", "200 MG", "2MG", "60MG", NA, "300IU", 
                             NA, "600 MG", "500MG", "625MG", NA, NA, "50MG/ML", "40MG", "200MG", 
                             "200MG", "200MG", "5 MG", "5 MG", "200MG", "300IU/3ML", "0.05%", 
                             "112.5 BILLION", "10.8MG"))

我想要的数据框是:

# > df
#   ID DRUG_STRENGTH DRUG_STRENGTH_NO DRUG_STRENGTH_UNIT
# 1   1         50 MG               50                 MG
# 2   2       1250 MG             1250                 MG
# 3   3         20 MG               20                 MG
# 4   4        200 MG              200                 MG
# 5   5           2MG                2                 MG
# 6   6          60MG               60                 MG
# 7   7          <NA>             <NA>               <NA>
# 8   8         300IU              300                 IU
# 9   9          <NA>             <NA>               <NA>
# 10 10        600 MG              600                 MG
# 11 11         500MG              500                 MG
# 12 12         625MG              625                 MG
# 13 13          <NA>             <NA>               <NA>
# 14 14          <NA>             <NA>               <NA>
# 15 15       50MG/ML               50              MG/ML
# 16 16          40MG               40                 MG
# 17 17         200MG              200                 MG
# 18 18         200MG              200                 MG
# 19 19         200MG              200                 MG
# 20 20          5 MG                5                 MG
# 21 21          5 MG                5                 MG
# 22 22         200MG              200                 MG
# 23 23     300IU/3ML              300             IU/3ML
# 24 24         0.05%             0.05                  %
# 25 25 112.5 BILLION            112.5            BILLION
# 26 26        10.8MG             10.8                 MG

我的代码给了我想要的 df,但我想问一下是否有更好的方法来编写正则表达式。

df <- df %>%
  mutate(DRUG_STRENGTH_NO = str_extract(DRUG_STRENGTH, pattern = "^\\d\\.?\\d?\\.?\\d?\\.?\\d*"),
         DRUG_STRENGTH_UNIT = str_trim(str_replace(DRUG_STRENGTH, pattern = "^\\d\\.?\\d?\\.?\\d?\\.?\\d*", replacement = "")))

【问题讨论】:

    标签: r data-manipulation stringr text-manipulation


    【解决方案1】:

    我会为此使用extract

    library(tidyverse)
    df %>% 
      extract(DRUG_STRENGTH, into = c("No", "Unit"), "([0-9.]+)(.*)", remove = FALSE)
    ##    ID DRUG_STRENGTH    No     Unit
    ## 1   1         50 MG    50       MG
    ## 2   2       1250 MG  1250       MG
    ## 3   3         20 MG    20       MG
    ## 4   4        200 MG   200       MG
    ## 5   5           2MG     2       MG
    ## 6   6          60MG    60       MG
    ## 7   7          <NA>  <NA>     <NA>
    ## 8   8         300IU   300       IU
    ## 9   9          <NA>  <NA>     <NA>
    ## 10 10        600 MG   600       MG
    ## 11 11         500MG   500       MG
    ## 12 12         625MG   625       MG
    ## 13 13          <NA>  <NA>     <NA>
    ## 14 14          <NA>  <NA>     <NA>
    ## 15 15       50MG/ML    50    MG/ML
    ## 16 16          40MG    40       MG
    ## 17 17         200MG   200       MG
    ## 18 18         200MG   200       MG
    ## 19 19         200MG   200       MG
    ## 20 20          5 MG     5       MG
    ## 21 21          5 MG     5       MG
    ## 22 22         200MG   200       MG
    ## 23 23     300IU/3ML   300   IU/3ML
    ## 24 24         0.05%  0.05        %
    ## 25 25 112.5 BILLION 112.5  BILLION
    ## 26 26        10.8MG  10.8       MG
    

    您可能需要稍后返回并检查是否有任何空白。

    【讨论】:

    • 不错的策略 +1 ...这比我想象的要容易。
    【解决方案2】:

    或者,如果您确保数字和余数用空格隔开,您可以使用 strsplit 或 str_split(带或不带简化)。 使用正则表达式可能会更灵活,但在更复杂的情况下也会变得混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2022-06-20
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多