SAS中特定子字符串的频率

时间:2016-04-19 15:29:24

标签: string sas substring extract

我无法弄清楚如何在字符串中提取特定文本。我的数据集已从去识别的电子健康记录中提取,并包含我们的患者开处方的每种药物的清单。然而,我只关注一个特定的药物清单,我在另一张表中。每个细胞内都有药物的名称,剂量和形式(标签,帽子等)[见图片]。然而,大部分信息对我的分析并不重要,我只需要提取与我的清单相符的药物名称。从每个字符串中提取第一个单词也是有用的,因为它(在大多数情况下)是药物的名称。

我已经研究了许多不同的拉弦子方法,但还没有找到符合我需要的东西。任何帮助将不胜感激。

感谢。

Medication Description Medications of Interest

        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;

2 个答案:

答案 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;