我无法弄清楚如何在字符串中提取特定文本。我的数据集已从去识别的电子健康记录中提取,并包含我们的患者开处方的每种药物的清单。然而,我只关注一个特定的药物清单,我在另一张表中。每个细胞内都有药物的名称,剂量和形式(标签,帽子等)[见图片]。然而,大部分信息对我的分析并不重要,我只需要提取与我的清单相符的药物名称。从每个字符串中提取第一个单词也是有用的,因为它(在大多数情况下)是药物的名称。
我已经研究了许多不同的拉弦子方法,但还没有找到符合我需要的东西。任何帮助将不胜感激。
感谢。
Data DRUGS;
infile datalines flowover;
length drug1-drug69 $20;
array drug[69];
input (drug1-drug69)($);
datalines;
AMITRIPTYLINE
AMOXAPINE
BUPROPION
CITALOPRAM
CLOMIPRAMINE
DESIPRAMINE
DOXEPIN
ESCITALOPRAM
FLUOXETINE
FLUVOXAMINE
IMIPRAMINE
ISOCARBOXAZID
MAPROTILINE
MIRTAZAPINE
NEFAZODONE
NORTRIPTYLINE
PAROXETINE
PHENELZINE
PROTRIPTYLINE
SERTRALINE
TRANYLCYPROMINE
TRAZODONE
TRIMIPRAMINE
VENLAFAXINE
AMITRIP
ELEVIL
ENDEP
LEVATE
ADISEN
AMOLIFE
AMOXAN
AMOXAPINE
DEFANYL
OXAMINE
OXCAP
WELLBUTRIN
BUPROBAN
APLENZIN
BUDEPRION
ZYBAN
CELEXA
ANAFRANIL
NORPRAMIN
SILENOR
PRUDOXIN
ZONALON
LEXAPRO
PROZAC
SARAFEM
LUVOX
TOFRANIL
TOFRANIL-PM
MARPLAN
LUDIOMIL
REMERON
REMERONSOLTAB
PAMELOR
PAXIL
PEXEVA
BRISDELLE
NARDIL
VIVACTIL
ZOLOFT
PARNATE
OLEPTRO
SURMONTIL
EFFEXOR
DESVENLAFAXINE
PRISTIQ
;;;;
run;
Data DM4_;
if _n_=1 then set DRUGS;
array drug[69];
set DM4;
do _i = 1 to countw(Description,' ().,');
_med = scan(Description,_i,' ().,');
_whichmed = whichc(_med, of drug[*]);
if _whichmed > 0 then leave;
end;
run;
Data DM_Meds (drop = drug1-drug69 _i _med _whichmed);
Set DM4_;
IF _whichmed > 0 then anti = _med;
else anti = ' ';
run;
答案 0 :(得分:1)
根据您的需要,这是一个相当普遍的问题,有很多可能的解决方案。
最简单的答案是创建一个数组,假设您的药物数量很少。这不一定是最快的解决方案,但它可以很好地工作并且构造起来很简单。只需将您的药物列表放入数据集,将其转换为水平(一行有大量药物),然后以这种方式加载它。你迭代药物名称中的单词,看看它们中是否有任何药物列表 - 如果是,那么宾果,你有药物!实际使用当然会在之后删除drug:
个变量。
这比反向更有效(搜索每种药物以查看它是否在药物名称中),因为药物列表中的单词通常比药物名称中的单词多。哈希解决方案可能会更快,如果您对哈希感到满意(将药物列表加载到哈希表中,然后使用find()
执行与whichc
在此处执行的操作相同的操作)。
data have;
input @1 medname $50.;
datalines;
PROVIGIL OR
ENSURE HIGH PROTEIN OR LIQD
BENADRYL 25 MG OR CAPS
ECOTRIN LOW STRENGTH 81 MG OR TBEC
SPIRONOLACTONE 25 MG PO TABS
NORVASC 5 MG OR TABS
FLUOXETINE HCL 25MG
IBUPROFEN 200MG
NEFAZODONE TABS OR CAPS 20MG
PAXIL (PAROXETINE HCL) 25MG
;;;;
run;
data drugs;
infile datalines flowover;
length drug1-drug19 $20;
array drug[19];
input (drug1-drug19) ($);
datalines;
AMITRIPTYLINE
AMOXAPINE
BUPROPION
CITALOPRAM
CLOMIPRAMINE
DESIPRAMINE
OXEPIN
ESCITALOPRAM
FLUOXETINE
FLUVOXAMINE
IMIPRAMINE
ISOCARBOXAZID
MAPROTILINE
MIRTAZAPINE
NEFAZODONE
NORTRIPTYLINE
PAROXETINE
PHENELZINE
PROTRIPTYLINE
;;;;
run;
data want;
if _n_ = 1 then set drugs;
array drug[19];
set have;
do _i = 1 to countw(medname,' ().,');
_medword = scan(medname,_i,' ().,');
_whichmed = whichc(_medword, of drug[*]);
if _whichmed > 0 then leave;
end;
run;
答案 1 :(得分:0)
对于PROC SQL来说,这应该是一项简单的任务。
我们假设您在表A中有患者信息,在表B中有药物名称(长格式,而不是您提供的宽格式)。这是代码过滤表A行到表C中,其中A中的描述包含B中的药物名称。
PROC SQL;
CREATE TABLE C AS SELECT DISTINCT *
FROM A LEFT JOIN B
ON UPCASE(A.description) CONTAINS UPCASE(B.drug);
QUIT;