2016-11-01 10 views
1

私は薬物の組み合わせの数を数えるのに問題があります。私のデータは2つのデータフレームで構成されています。 DF1は、IDが含まれ、そのようなものとして、薬物が見つかりました:全部で7140個の可能な組み合わせでR:同じID内で最も頻繁に組み合わせを見つける

combi1 | combi2 
----------------- 
drug1 | drug2 
drug1 | drug3 
drug1 | drug4 
drug2 | drug3 
drug2 | drug4 
drug2 | drug5 

ID | drug 
----------- 
1 | drug1 
1 | drug2 
1 | drug3 
2 | drug3 
2 | drug5 
3 | drug1 
3 | drug3 
3 | drug4 
3 | drug5 

DF2は、次のような2つの異なる薬物の全ての可能な薬剤の組み合わせを示しています。私が欲しいのは、どれくらいのIDが組み合わせ数drug1-drug2drug1-drug3などであるかを調べることです。

私は、二重forループしようとしている:一度に1行を確認することができるので、

counter=0 
for(com in 1:nrow(df2)){ 
for(id in 1:unique(df1$ID)){ 
    if(df2$combi1[com] %in% df1$drug[id] & df2$combi2[com] %in% df1$drug[id]) { 
    counter=counter+1 
    } 
} 
df2$count=counter 
counter=0 
} 

をしかし、それは動作しません。私はまたFind Most Frequent Combination within a Vector by Groupの解決策を試しましたが、運が全くありません。

さらに、私は3剤

EDITの組み合わせで同じことを実行する必要があります。 私は出力がDF2でこのようなことが好き、私はdrug1とdrug2が組み合わせとして発生した回数を、見ることができますID内。例えば、唯一のIDは、私がdata.tableのために達し、2つのIDがこの1のためにdrug1とdrug3

combi1 | combi2 | count 
----------------------- 
drug1 | drug2 | 1 
drug1 | drug3 | 2 
drug1 | drug4 | 0 
drug2 | drug3 | 1 
drug2 | drug4 | 0 
drug2 | drug5 | 0 
+0

[類似のポスト](http://stackoverflow.com/questions/19891278/r-table-of-interactions-case-with-pets-and-houses)を参照してください。 'cbind(df2、n = crossprod(table(df1))[as.matrix(df2)])' –

答えて

1

を持っていたのに対し、両方drug1とdrug2を持っていましたが、あなたは同じように簡単にtidyrを使用することができます。

library(data.table) 
set.seed(213) # set seed 
d <- data.table(ID = rep(1:3, each = 3), drug = paste0("drug", sample(1:5, 9, rep = T))) 

get_combs <- function(x, n = 2){ 
    uniq_x <- sort(unique(x)) 
    if(length(uniq_x) < n){ 
    return(NULL) 
    } else { 
    return(as.data.frame(t(combn(uniq_x, n)), stringsAsFactors = FALSE)) 
    } 

} 

combi <- d[, get_combs(drug), by = ID][order(V1, V2),] 
combi[ , .N, by = .(V1, V2)] 

     V1 V2 N 
1: drug1 drug2 2 
2: drug1 drug4 2 
3: drug2 drug4 2 
4: drug3 drug5 1 
+0

これは実際には薬物の組み合わせではありません。 – reuss

+0

申し訳ありません、あなたが正しいです - 私はあなたの質問を誤解しました。私は別のショットを与えるでしょう。 –

+0

その2番目の出力は、問題を明確にするのに役立ちました。 –

0

データを再構築する方が簡単かもしれません:

library(reshape2) 
set.seed(213) # set seed 
df <- data.frame(ID = rep(1:3, each = 3), drug = paste0("drug", sample(1:5, 9, rep = T))) #define data 
df <- dcast(df, ID ~ drug) 
df 
    ID drug1 drug2 drug3 drug4 drug5 
1 1  1  1  0  1  0 
2 2  0  0  2  0  1 
3 3  1  1  0  1  0 

は今、あなたはIDごとに1行の組み合わせを持っていて、特定の組み合わせを持つすべてのIDを見つけるために、標準のサブセットを使用することができます。これはあなたが探しているものですか?そうでない場合は、質問に希望の出力を追加してください。

+0

いいえ、実際はありません。多くのIDにdrug1とdrug2の両方があることを知りたい。編集:私はこれを書いた後、ちょうどあなたの答えに多くを追加しました – reuss

+0

私は希望の出力を下に自分の質問に編集を追加しました – reuss

関連する問題