如何在r中使用stringr将字符串拆分为数字和剩余字符串?

如何在r中使用stringr将字符串拆分为数字和剩余字符串?,r,data-manipulation,stringr,text-manipulation,R,Data Manipulation,Stringr,Text Manipulation,我想使用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", "20

我想使用
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药物强度药物强度无药物强度单位
#1 150毫克50毫克
#2 1250毫克1250毫克
#3 20毫克20毫克
#4 200毫克200毫克
#5 2MG 2 MG
#6 60毫克60毫克
# 7   7                                      
#8 300国际单位300国际单位
# 9   9                                      
#10 10 600毫克600毫克
#11 500毫克500毫克
#12 625毫克625毫克
# 13 13                                      
# 14 14                                      
#15 50MG/ML 50 MG/ML
#16 40毫克40毫克
#17 200MG 200MG
#18 200MG 200MG
#19 200MG 200MG
#20 5毫克5毫克
#215毫克5毫克
#22 200MG 200MG
#23300IU/3ML 300IU/3ML
# 24 24         0.05%             0.05                  %
#25251125亿1125亿
#26 10.8毫克10.8毫克
我的代码给出了我想要的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 = "")))
df%
突变(药物浓度=str提取物(药物浓度,模式=“^\\d\\.?\\d\.?\\d\.?\\d*”),
药物强度单位=str\U修剪(str\U替换(药物强度,模式=“^\\d\\.?\\d?\.?\\d*”,替换=“))

对此,我将使用
提取

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
库(tidyverse)
df%>%
提取(药物浓度,单位=c([0-9.]+)(.*),去除=FALSE)
##ID药力无单位
##1 150毫克50毫克
##2 1250毫克1250毫克
##3 20毫克20毫克
##4 200毫克200毫克
##5 2MG 2 MG
##6 60毫克60毫克
## 7   7                 
##8 300国际单位300国际单位
## 9   9                 
##10 10 600毫克600毫克
##11 500毫克500毫克
##12 625毫克625毫克
## 13 13                 
## 14 14                 
##15 50MG/ML 50 MG/ML
##16 40毫克40毫克
##17 200MG 200MG
##18 200MG 200MG
##19 200MG 200MG
##20 5毫克5毫克
##215毫克5毫克
##22 200MG 200MG
##23300IU/3ML 300IU/3ML
## 24 24         0.05%  0.05        %
##25251125亿1125亿
##26 10.8毫克10.8毫克

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

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

Nice strategy+1。。。这比我想象的要容易。
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