2011-02-08 16 views
3

ご理解いただきありがとうございます。行メンバーシップに基づく論理のベクトル

私は、患者と投薬を詳述する大規模なデータセットを扱っています。

投薬量と一致しない限り(通常は)無意味なので、投薬は難しいです。

私は個々の患者が行によって表されるベクトル(Drug1、Drug2 ..... Drug16)を持つデータフレームを持っています。 ベクターは実際には100sの可能なレベル(患者が服用することができるすべての薬剤)の因子である。

私がやりたがっているのは、患者が特定の薬物に罹っていないかどうかを教えてくれるデータフレームにバインドできる論理のベクトル(TTTTFFFFTTT ......)です。

次に、モデルでは、特に重要な薬物の存在または非存在をカテゴリの共変量として使用できます。

私はgrepを使って行を検索しましたが、識別子のベクトルを生成できますが、論理のベクトルを生成できないようです。

私は何かを間違っていると思います。

names(drugindex) 
[1] "book.MRN" "DRUG1" "DRUG2" "DRUG3" "DRUG4" "DRUG5" 
[7] "DRUG6" "DRUG7" "DRUG8" "DRUG9" "DRUG10" "DRUG11" 
[13] "DRUG12" "DRUG13" "DRUG14" "DRUG15" "DRUG16" 

> truvec<-drugindex$book.MRN[as.vector(unlist(apply(drugindex[,2:17], 2, grep, pattern="Lamotrigine")))] 
> truvec 
truvec 
[1] 0024633 0008291 0008469 0030599 0027667 
37 Levels: 0008291 0008469 0010188 0014217 0014439 0015822 ... 0034262 

> head(drugindex) 
    book.MRN  DRUG1  DRUG2   DRUG3  DRUG4  DRUG5 
4 0008291 Venlafaxine Procyclidine Flunitrazepam Amisulpiride Clozapine 
31 0008469 Venlafaxine Mirtazapine  Lithium Olanzapine Metoprolol 
3 0010188 Flurazepam Valproate  Olanzapine Mirtazapine Esomeprazole 
13 0014217  Aspirin  Ramipril Zuclopenthixol Lorazepam Haloperidol 
15 0014439 Zopiclone  Diazepam Haloperidol Paracetamol   <NA> 
5 0015822 Olanzapine Venlafaxine  Lithium Haloperidol Alprazolam 
     DRUG6  DRUG7  DRUG8  DRUG9   DRUG10 DRUG11 DRUG12 
4 Lamotrigine Alprazolam Lithium Alprazolam   <NA> <NA> <NA> 
31 Lamotrigine Ramipril Alprazolam Zolpidem Trifluoperazine <NA> <NA> 
3 Paracetamol Alprazolam Citalopram  <NA>   <NA> <NA> <NA> 
13  <NA>  <NA>  <NA>  <NA>   <NA> <NA> <NA> 
15  <NA>  <NA>  <NA>  <NA>   <NA> <NA> <NA> 
5   <NA>  <NA>  <NA>  <NA>   <NA> <NA> <NA> 
    DRUG13 DRUG14 DRUG15 DRUG16 
4 <NA> <NA> <NA> <NA> 
31 <NA> <NA> <NA> <NA> 
3 <NA> <NA> <NA> <NA> 
13 <NA> <NA> <NA> <NA> 
15 <NA> <NA> <NA> <NA> 
5 <NA> <NA> <NA> <NA> 

そして、何が欲しいその患者がそれに

であるかどうかと言って、各薬剤のための論理名のベクトルでは、あなたの時間をありがとうございました。

ロス・ダンMRCPsych

"テoccidere possunt sedのTE edere NE possunt、nefas EST"。

答えて

9

apply試行が終了しましたが、MARGIN=2は、行ではなく列に対して機能を適用します。また、grepは一致のの位置を返します。論理ベクトルを返すgreplが必要です。これを試してみてください:

apply(x[,-1], 1, function(x) any(grepl("Aspirin",x))) 

また、あなたはより直感的に見つけることがある、%in%を使用することができます。

apply(x[,-1], 1, "%in%", x="Aspirin") 
+0

トリッキーなベクトル化アプローチは 'rowSums(x [、-1] ==" Asprin ")> 0' – hadley

+0

です。ハドレー:あなたは' na.rm = TRUE'を必要とします。そうでなければOPのケースでは 'NA' 。 –

4

まず、データ構造にコメント。あなたは、患者ごとに1つの行と薬物の複数の列を持つ、「ワイド」形式と呼ばれるデータを持っています。通常、患者ごとに行を再構成し、薬剤については単一の列を使用する「長い」形式は、データ操作により適しています。データをワイドからロングに、またはその逆に変更するには、リシェイプパッケージをご覧ください。あなたが戻って古い構造が必要な場合は、castを使用することができます。私は

編集を言うので...可能性がある場合、多くのクリーナー、と明らか

library(reshape) 
dnow <- melt(drugindex, id.var='book.MRN') 
subset(dnow, value=='Lamotrigine') 

、コード:このケースでは、のようなものを持っているでしょう:

cast(subset(dnow, value=='Lamotrigine'), book.MRN ~ value) 

コメントで@jonwが示唆しています。

+0

長い形式(通常は時間の経過とともに)を繰り返す測定には意味があると思います。しかし、この場合、ワイドフォーマットは多くの意味を持ちます。なぜなら、あなたが一人の観察を話しているだけで、あなたが取っている薬を記録しているだけなのですから。 – Dason

+0

サブセット(dnow、value == 'Lamotrigine') '(可変列にレベル" DRUG1 "、" DRUG2 "、...など)がありません。 –

+3

@Dason。 「ドラッグ」ディメンションは注文されていませんが、これは無関係です。データ保存目的に関連するものは、個人レベル対薬物レベル情報の数である。個々の特定の変数が多すぎるとデータサイズが増加します...高速です。一方、N 'Drug'変数を作成して突然誰かが 'N + 1'薬を服用すれば、新しい列を作成する必要があります。ただし、この場合、個々のレベル変数(ID)は1つのみです。 –

関連する問題