从 R 中的文本列中提取特定数据

Extracting specific data from text column in R

我有一列药物名称的数据集。我试图从这些数据中提取每种药物的名称、强度和单位。术语 MG 和 ML 是设置中强度的限定词。例如,让我们考虑以下给定的药物名称数据集。

 Medicine name
----------------------
 FALCAN 150 MG tab
 AUGMENTIN 500MG tab
 PRE-13 0.5 ML PFS inj
 NS.9%w/v 250 ML, Glass Bottle

我想从此数据集中提取以下信息列,

Name     | Strength |Unit
---------| ---------|------
FALCAN   | 150      |MG
AUGMENTIN| 500      |MG
PRE-13   | 0.5      |ML
NS.9%w/v | 250      |ML

我试过grepl等命令,但找不到好的解决方案。我有大约 >12000 个数据要识别。数据没有固定规律,少数地方MG和强度之间没有space,比如300MG。 ,

如果输入 L 在末尾的注释中可重复给出,则使用 sub 替换 MG 或 ML,然后用 space 替换 MG 或 ML 之后的所有内容然后使用 read.table:

阅读
s <- sub("(M[GL]).*", " \1", L)
read.table(text = s, as.is = TRUE, skip = 1, col.names = c("Name", "Strength", "Unit"))

给予:

       Name Strength Unit
1    FALCAN    150.0   MG
2 AUGMENTIN    500.0   MG
3    PRE-13      0.5   ML
4  NS.9%w/v    250.0   ML

注:使用的输入L是:

L <- c("Medicine name", " FALCAN 150 MG tab", " AUGMENTIN 500MG tab", 
" PRE-13 0.5 ML PFS inj", " NS.9%w/v 250 ML, Glass Bottle")

您可以使用多个正则表达式来实现这一点。所有人都以为我不是正则表达式冠军,我使用它的目的与您在这里展示的目的相同。

meds <- c('FALCAN 150 MG tab',
'AUGMENTIN 500MG tab',
'PRE-13 0.5 ML PFS inj',
'NS.9%w/v 250 ML, Glass Bottle')

library(stringr)

#Name
trimws(str_extract(str_extract(meds, '.* [0-9.]{3}'),'.* '))

#Strength
str_extract(str_extract(meds, '[0-9.]{3}( M|M)[GL]'),'[0-9.]*')

#Unit
str_extract(str_extract(meds, '( M|[0-9]M)[GL]'), 'M[GL]')

我知道很多这些医学符号可能会有很大的不同,因此我更喜欢通过正则表达式来提取每个项目,这与 G. Grothendieck 提出的解决方案相反,他期望数据中有一定的结构 ( 3 列)。 这样我就可以通过检查所有生成 NA 值的字符串来调整每个项目。

A <- trimws(strsplit('FALCAN 150 MG tab
 AUGMENTIN 500MG tab
PRE-13 0.5 ML PFS inj
NS.9%w/v 250 ML, Glass Bottle',"\n")[[1]])

plyr::ldply(strsplit(A," "), function(i){
    new <- gsub("[[:punct:]]$","",i)
    Unit <- gsub("[0-9]","",new[grep("^([0-9]{1,})?[A-Z]{2}$", new)])
    data.frame(
        Name = i[[1]], Strength = gsub("[A-z]",'',i[[2]]),Unit= Unit,
        stringsAsFactors = F
    )
})

       Name Strength Unit
1    FALCAN      150   MG
2 AUGMENTIN      500   MG
3    PRE-13      0.5   ML
4  NS.9%w/v      250   ML