1

私は R を使用して薬物と反応の大規模なデータセットを扱っています。今のところ、レポート ID 番号、薬物名、および報告された反応をリストする非常に長いデータ フレームとして構造化されたデータがあります。おわかりのように、ID と薬物、および薬物と反応の間には 1 対多の関係があります。

このデータセットは、ここで複製できるものよりもはるかに大きいことを念頭に置いて、どの薬物の組み合わせがどの反応をどの頻度でもたらすかを見つける方法を知りたい.

最も重要なことは、このような問題にどのようにアプローチするかに興味があるということです。データは正しく構造化されていますか? どのような概念やライブラリについて読む必要がありますか?

実際のデータへのリンクは次のとおりです: https://www.dropbox.com/s/kzx4mpyytbo9zil/query_result.csv

   ID    DRUG                                REACTION
1  1827  ASPIRIN                           CHEST PAIN
2  1827  CLARINEX                          CHEST PAIN
3  1827  ASPIRIN                                COUGH
4  1827  CLARINEX                               COUGH
5  1827  ASPIRIN                HAEMOGLOBIN DECREASED
6  1827  CLARINEX               HAEMOGLOBIN DECREASED
7  1827  ASPIRIN           NEUTROPHIL COUNT INCREASED
8  1827  CLARINEX          NEUTROPHIL COUNT INCREASED
9  1827  ASPIRIN               PHARYNGOLARYNGEAL PAIN
10 1827  CLARINEX              PHARYNGOLARYNGEAL PAIN
...

私の小さな小さな脳では、最終結果は次のようになります...

    Drug1       Drug2       Reaction            Frequency
1   tylenol     alcohol     hepatic failure     298
2   advil       aleve       bleeding            201 
3   aspirin     advil       renal failure       199
4   docusate    senna       diarrhea            146
5   senna       sudafed     palpitations        121
6   xanax       alcohol     sedation            111
7   clarinex    benadryl    dry mouth           96
...
569 ASPIRIN     CLARINEX    CHEST PAIN          2

Drug1 と Drug2 は、データセット全体で最も頻度の高い薬物ペアです。「薬物ペア」は、同じレポート ID を持つ 2 つの薬物の任意の組み合わせとして定義されます。上記の出力例は、「行 1 には 298 の一意のレポート ID があり、その反応が肝不全であった」と解釈されます。

4

1 に答える 1

2

わかりました、回答を試みます - 質問が正しく得られたことを願っています。コードは、洗練された/最終的なものではなく、いくつかのアイデアを提供することを目的としています。
注意: 理解しやすくするために、可能なベクトル化/適用関数の代わりに for ループを意図的に使用しました (適用関数に精通している人は for ループも理解できます ;-))。
注 2: データはごくわずかしかないため、データセット全体のコードをテストできませんでした。
EDIT : 上記の例に基づく列 - csv データとは異なる可能性があります。

重要なポイントは次のとおりです。

  • unique[など _
  • utils::combn組み合わせを取得する
  • 合計 (FALSE/TRUE 値) をカウントする

それが役立つことを願っています!

require(utils)

df <- read.table(header=TRUE, 
text="LINE ID DRUG REACTION
1 1827 ASPIRIN CHEST_PAIN
2 1827 CLARINEX CHEST_PAIN
3 1827 ASPIRIN COUGH
4 1827 CLARINEX COUGH
5 1827 ASPIRIN HAEMOGLOBIN_DECREASED
6 1827 CLARINEX HAEMOGLOBIN_DECREASED
7 1827 ASPIRIN NEUTROPHIL_COUNT_INCREASED
8 1827 CLARINEX NEUTROPHIL_COUNT_INCREASED
9 1827 ASPIRIN PHARYNGOLARYNGEAL_PAIN
10 1827 CLARINEX PHARYNGOLARYNGEAL_PAIN")

# temporary object to collect if a combination is present
Results <- data.frame(Drug1=NA, Drug2=NA, Reaction=NA, Reaction.occurs=NA)
n=1 # start first line in Results object

#  walk through each ID ... 
for (ID in unique(df$ID)) { 

  # ... and each possible pair of drugs within a (report) ID ...
  drug.pairs <- utils::combn(x=unique(df[df$ID == ID, "DRUG"]), m=2) # the columns 
  for (ii in 1:ncol(drug.pairs)) {

    # ... and each reaction ...
    for (reaction in unique(df$REACTION)) {
      Results[n, "Drug1"] <- drug.pairs[1,ii]
      Results[n, "Drug2"] <- drug.pairs[2,ii]
      Results[n, "Reaction"] <- reaction
      Results[n, "Reaction.occurs"] <- drug.pairs[1,ii] %in% df[df$REACTION == reaction & df$ID == ID, "DRUG"] &
        drug.pairs[2,ii] %in% df[df$REACTION == reaction & df$ID == ID, "DRUG"]
      n <- n+1
    }
  }
}

head(Results)

# then find the unique Drug1 - Drug2 -Reaction combinations, and count the TRUE values:
(Results[!duplicated(Results[,1:3]), ][,1:3])
(unique(Results[, 1:3]))

# Results2 contains only the unique combinations
Results2 <- Results[!duplicated(Results[,1:3]), ][,1:3]

# calculatethe frequencies
for (i in 1:nrow(Results2)) {
  Results2[i, "Frequency"] <- sum(Results[Results$Drug1 == Results2[i, "Drug1"] & 
                                            Results$Drug2 == Results2[i, "Drug2"] & 
                                            Results$Reaction == Results2[i, "Reaction"], ]$Reaction.occurs)
}

Results2
# --- end ----

与えます:

    Drug1    Drug2                   Reaction Frequency
1 ASPIRIN CLARINEX                 CHEST_PAIN         1
2 ASPIRIN CLARINEX                      COUGH         1
3 ASPIRIN CLARINEX      HAEMOGLOBIN_DECREASED         1
4 ASPIRIN CLARINEX NEUTROPHIL_COUNT_INCREASED         1
5 ASPIRIN CLARINEX     PHARYNGOLARYNGEAL_PAIN         1
于 2014-08-10T16:53:08.460 に答える