首页 文章

SAS中特定子字符串的频率

提问于
浏览
1

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

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

谢谢 .

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 回答

  • 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;
    
  • 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;
    

相关问题