2016-04-19 12 views
1

文字列内の特定のテキストを抽出する方法がわかりません。私のデータセットは、識別されていない電子健康記録から引き出され、患者が処方されたすべての医薬品のリストを含んでいます。しかし、私は別のテーブルにある特定の薬のリストだけに関心があります。各セルには、投薬、用量、およびフォームの名前(タブ、キャップなど)[画像を参照]があります。この情報の多くは私の分析には重要ではありません。私は自分のリストに合った投薬名を抽出するだけです。また、各文字列から最初の単語を抽出すると便利です(ほとんどの場合)ので、薬の名前です。SASの特定の部分文字列の頻度

私はサブストリングを引き出すさまざまな方法を検討しましたが、私のニーズを満たすものはほとんど見つかりませんでした。どんな助けでも大歓迎です。

ありがとうございました。

Medication DescriptionMedications 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; 
+0

あなたがいないので、あなたはすでに試したのメソッドの数」を言及するのは良い考えですそれらをもう一度答えとして得る。 – Joe

+0

理想的には、私はあなたがこのQで説明している方法のようなものを使用します:http://stackoverflow.com/questions/13862573/sas-prx-to-extract-substring-please)私は薬の辞書を持っています。 'Description'変数内で一致させ、投与量と形態を削除しながら薬剤名部分文字列を返します。私は別のテーブルに薬の名前があり、このチュートリアルと一緒に以前の答えの組み合わせを使用しようとしています:http://www2.sas.com/proceedings/forum2007/223-2007.pdf – diaferiaj

+0

次に私の答えはより良いです、私は疑う。私はPRXソリューションが理想的ではないと思いますが、それは非常に面倒です。 – Joe

答えて

1

これは、ニーズに応じて、可能な解決策の束とかなり共通の問題です。

最も簡単な答えは、薬品が少ないと仮定して配列を作成することです。これは必ずしも最速のソリューションではありませんが、それはかなりうまく動作し、構築が簡単です。あなたのドラッグリストをデータセットに入れて、それを横に移し(薬をたくさん入れて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での説明はB.に薬剤名が含まれているテーブルCにコード・フィルタリング・テーブルAの行である

PROC SQL; 
CREATE TABLE C AS SELECT DISTINCT * 
    FROM A LEFT JOIN B 
    ON UPCASE(A.description) CONTAINS UPCASE(B.drug); 
QUIT; 
+0

"このクエリの実行には、最適化できない1つ以上のデカルト積ジョインを実行する必要があります。"その後、" Drugs "という名前の追加変数を持つ元のテーブルが返されますが、それは空です。 – diaferiaj

関連する問題