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