如何使用 r 中的 stringr 将字符串拆分为数字和剩余字符串?
How do I split strings into number and the remaining string using stringr in r?
我想使用 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 = "")))
为此我会使用 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
稍后您可能需要返回并检查是否有空格。
或者,如果您确保数字和余数之间用 space 分隔,您可以使用 strsplit 或 str_split(有或没有简化)。
使用正则表达式可能会更灵活,但在更复杂的情况下也会变得混乱。
我想使用 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 = "")))
为此我会使用 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
稍后您可能需要返回并检查是否有空格。
或者,如果您确保数字和余数之间用 space 分隔,您可以使用 strsplit 或 str_split(有或没有简化)。 使用正则表达式可能会更灵活,但在更复杂的情况下也会变得混乱。