如何通过匹配字母和字符来提取文本?
How can extract text by matching letters and characters?
我有一个包含
的数据框
Drug name
コージネイトFSバイオセット注250 250国際単位
アドベイト注射用500 500単位
我想提取日本药物名称和数量以创建两个新列,
Drug_clean Volume
コージネイト 250
アドベイト 500
为了做到这一点,我打算识别F的字母和特定字符“注”,但我不知道该怎么做。你能告诉我如何实现吗?
谢谢。
这里有几个障碍 - 一是提取匹配项,二是将 Unicode 转换为数字。
我们可以通过定义一个小的翻译函数,并设置适当的语言环境来做到这一点。
df <- tibble(drug_name = c("コージネイトFSバイオセット注250 250国際単位", "アドベイト注射用500 500単位"))
library(stringr)
library(dplyr)
tmcn::setchs() # to set locale (Chinese here, might need an appropriate Japanese instead)
translate <- Vectorize(function(x){
x <- strsplit(x, "")
as.list(x[[1]]) %>%
lapply(function(x){
switch(x,
"3" = 3, "7" = 7, "8" = 8, "2" = 2, "5" = 5,
"4" = 4, "6" = 6, "1" = 1, "9" = 9, "0" = 0, NA
)}) %>%
paste0(collapse = "") %>% as.numeric()
})
df %>%
transmute(
Drug_clean = ifelse(str_detect(drug_name, "F"),
str_extract(drug_name, ".*(?=F)"),
str_extract(drug_name, ".*(?=注)")),
Volume = translate(str_extract(drug_name, "[3782546190].{2}"))
)
#> A tibble: 2 x 2
#> Drug_clean Volume
#> <chr> <dbl>
#> 1 コージネイト 250
#> 2 アドベイト 500
对于字符向量,您可以使用 strsplit()
from base 并使用 |
分隔不同的分隔符。从您的示例中,您需要未列出的 lapply()
提供的每个拆分的第一个元素。
df<- rbind("コージネイトFSバイオセット注250 250国際単位",
"アドベイト注射用500 500単位")
#extract the columns
library(dplyr)
Drug_clean <-strsplit(df,"F|注") %>% lapply(., `[[`, 1) %>% unlist()
Volume <- str_extract(df, "[378254619].{2}")
tibble(Drug_clean,Volume)
> tibble(Drug_clean,Volume)
# A tibble: 2 × 2
Drug_clean Volume
<chr> <chr>
1 コージネイト 250
2 アドベイト 500
要获取 Volume 列的 as.numeric(),请遵循 @Donald Seinen 的优秀 switch()
代码。
我有一个包含
的数据框Drug name
コージネイトFSバイオセット注250 250国際単位
アドベイト注射用500 500単位
我想提取日本药物名称和数量以创建两个新列,
Drug_clean Volume
コージネイト 250
アドベイト 500
为了做到这一点,我打算识别F的字母和特定字符“注”,但我不知道该怎么做。你能告诉我如何实现吗?
谢谢。
这里有几个障碍 - 一是提取匹配项,二是将 Unicode 转换为数字。 我们可以通过定义一个小的翻译函数,并设置适当的语言环境来做到这一点。
df <- tibble(drug_name = c("コージネイトFSバイオセット注250 250国際単位", "アドベイト注射用500 500単位"))
library(stringr)
library(dplyr)
tmcn::setchs() # to set locale (Chinese here, might need an appropriate Japanese instead)
translate <- Vectorize(function(x){
x <- strsplit(x, "")
as.list(x[[1]]) %>%
lapply(function(x){
switch(x,
"3" = 3, "7" = 7, "8" = 8, "2" = 2, "5" = 5,
"4" = 4, "6" = 6, "1" = 1, "9" = 9, "0" = 0, NA
)}) %>%
paste0(collapse = "") %>% as.numeric()
})
df %>%
transmute(
Drug_clean = ifelse(str_detect(drug_name, "F"),
str_extract(drug_name, ".*(?=F)"),
str_extract(drug_name, ".*(?=注)")),
Volume = translate(str_extract(drug_name, "[3782546190].{2}"))
)
#> A tibble: 2 x 2
#> Drug_clean Volume
#> <chr> <dbl>
#> 1 コージネイト 250
#> 2 アドベイト 500
对于字符向量,您可以使用 strsplit()
from base 并使用 |
分隔不同的分隔符。从您的示例中,您需要未列出的 lapply()
提供的每个拆分的第一个元素。
df<- rbind("コージネイトFSバイオセット注250 250国際単位",
"アドベイト注射用500 500単位")
#extract the columns
library(dplyr)
Drug_clean <-strsplit(df,"F|注") %>% lapply(., `[[`, 1) %>% unlist()
Volume <- str_extract(df, "[378254619].{2}")
tibble(Drug_clean,Volume)
> tibble(Drug_clean,Volume)
# A tibble: 2 × 2
Drug_clean Volume
<chr> <chr>
1 コージネイト 250
2 アドベイト 500
要获取 Volume 列的 as.numeric(),请遵循 @Donald Seinen 的优秀 switch()
代码。