2011-08-25 10 views
9

ブール値のフィールドの数に基づいて係数を決定するか、新しいカテゴリフィールドを作成する最良の方法は何ですか?この例では、薬剤の独特の組み合わせの数を数える必要があります。ブール値の組み合わせの数を数える方法R

> MultPsychMeds 
     ID OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE 
    1 A   1   1   0   0 
    2 B   1   0   1   0 
    3 C   1   0   1   0 
    4 D   1   0   1   0 
    5 E   1   0   0   1 
    6 F   1   0   0   1 
    7 G   1   0   0   1 
    8 H   1   0   0   1 
    9 I   0   1   1   0 
    10 J   0   1   1   0 

おそらく、別の方法として、ピボットまたはクロス集計をする必要があります。ここでreshapeplyrパッケージを使用して一つの手法だ

MultPsychMeds <- structure(list(ID = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), OLANZAPINE = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L), HALOPERIDOL = c(1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), QUETIAPINE = c(0L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L), RISPERIDONE = c(0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 0L, 0L)), .Names = c("ID", "OLANZAPINE", "HALOPERIDOL", 
"QUETIAPINE", "RISPERIDONE"), class = "data.frame", row.names = c(NA, 
-10L)) 
+2

+1。しかし、あなたのタイトルを更新する必要があると信じています。ブーリアン(論理)が含まれていないように見えますし、「変換」も行われていません。 「共起数を数える」かそれに類するものに修正することはできますか? –

+0

ありがとうございます。実際の質問と一致するようにタイトルを改訂しました。 Booleanについては、生データには、.csvファイルからロードするときに、FALSEの場合は0、TRUEの場合は1が含まれ、RはIntegersに設定されます。これらが最初に論理変数に変換された方が良いでしょうか? – Rollie

+1

ブール値への参照はきれいで直感的だと思いますが、Rは1とTRUEを1つの同じ値にします(これが真でない場合があります)。たとえば、 '> 1 == TRUE [1] TRUE' – Chase

答えて

8

library(reshape) 
library(plyr) 

#Melt into long format 
dat.m <- melt(MultPsychMeds, id.vars = "ID") 
#Group at the ID level and paste the drugs together with "/" 
out <- ddply(dat.m, "ID", summarize, combos = paste(variable[value == 1], collapse = "/")) 

#Calculate a table 
with(out, count(combos)) 

         x freq 
1 HALOPERIDOL/QUETIAPINE 2 
2 OLANZAPINE/HALOPERIDOL 1 
3 OLANZAPINE/QUETIAPINE 3 
4 OLANZAPINE/RISPERIDONE 4 
+0

これは非常に役に立ち、ちょうど私が探していたものです。ありがとうございました – Rollie

5

このデータフレームはとRに複製することができ

Combination   Count 
OLANZAPINE/HALOPERIDOL  1 
OLANZAPINE/QUETIAPINE  3 
OLANZAPINE/RISPERIDONE  4 
HALOPERIDOL/QUETIAPINE  2 

:最終的な結果は次のようなものを見てする必要がありますちょうど楽しみのために、ベースRソリューション(それはオンライナーに変えることができます:-)):

data.frame(table(apply(MultPsychMeds[,-1], 1, function(currow){ 
    wc<-which(currow==1) 
    paste(colnames(MultPsychMeds)[wc+1], collapse="/") 
}))) 
2

もう一つの方法は次のようになります。

subset(
    as.data.frame(
     with(MultPsychMeds, table(OLANZAPINE, HALOPERIDOL, QUETIAPINE, RISPERIDONE)), 
     responseName="count" 
    ), 
    count>0 
) 

それはあなたがそれを望んで正確な方法はありませんが、迅速かつ簡単です

OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE count 
4   1   1   0   0  1 
6   1   0   1   0  3 
7   0   1   1   0  2 
10   1   0   0   1  4 

を与えます。


速記はplyr packageにあります。データを提供するための

require(plyr) 
count(MultPsychMeds, c("OLANZAPINE", "HALOPERIDOL", "QUETIAPINE", "RISPERIDONE")) 
# OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE freq 
# 1   0   1   1   0 2 
# 2   1   0   0   1 4 
# 3   1   0   1   0 3 
# 4   1   1   0   0 1 
関連する問題