2017-03-08 69 views
0

我在一列中有一組藥物名稱。我試圖從這些數據中提取每種藥物的名稱,強度和單位。術語MG和ML是設置中強度的限定符。例如,讓我們考慮以下給定的藥物名稱數據集。從文本列中提取特定數據R

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

您可以使用多個正則表達式實現此目的。所有人都認爲我不是正則表達冠軍,我用它來達到和你在這裏一樣的目的。

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.格羅騰迪克,誰在期待一定的結構提出的解決方案數據(3列)。 這樣我就可以通過檢查所有產生NA值的字符串來調整每個項目。

+0

感謝您的回答。我現在正在實施大數據集,並且無法理解,爲什麼我應該在參數中使用{3}?這是否意味着我需要匹配0-9,名稱中有3次? – vivek

+0

是的,這是關鍵,因爲我正在尋找劑量,一些藥物也可能有數字。您可以使用其他號碼或範圍。 – Wietze314

+0

是的,現在我明白了。 – vivek

2

如果輸入L是在結尾處註釋重複地給出然後使用sub一個空格,然後MG或者ML後更換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") 
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