从R

时间:2017-03-08 15:50:08

标签: r extract text-mining

我在一列中有一个药物名称数据集。我试图从这些数据中提取每种药物的名称,强度和单位。术语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和强度之间没有空间,例如300MG。 ,

3 个答案:

答案 0 :(得分:2)

如果输入L在最后的注释中可重复使用,则使用sub替换MG或ML以及之后的所有内容,后跟MG或ML,然后使用{ {1}}:

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

答案 1 :(得分:0)

您可以使用多个正则表达式来实现此目的。所有人都认为我不是一个正则表达式的冠军,我将它用于你出席的目的。

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值的所有字符串来调整每个项目。

答案 2 :(得分:0)

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