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