2017-09-01 10 views
1

データフレーム列のすべての組み合わせと並べ替えを計算するにはいくつかの助けが必要です。 マイdfはこのようになります(実際の1が40の以上の列と行15000+を持っている)データフレーム列の組み合わせと並べ替え

最初の列はユニークなIDが含まれてい
ID  A B C D 
ID_1 NA 1 NA 1 
ID_2 1 1 1 1 
ID_3 1 1 1 1 
ID_4 NA 1 1 NA 
ID_5 1 1 1 1 
ID_6 1 NA NA 1 
ID_7 1 1 1 1 
ID_8 1 NA NA NA 
ID_9 1 1 1 1 
ID_10 1 1 1 1 
ID_11 1 1 1 1 
ID_12 NA NA 1 1 
ID_13 NA NA 1 NA 
ID_14 1 1 1 NA 

、及びコラム2:どちらか含まれている1(存在)またはNA(40+不在)。

今私は各組み合わせと順列のためにどれくらいのIDが「存在しているか」を知る必要があります AB、AC、AD、BC ..... ABC、ABD ..... ABCDE、ABCDF ....等々。私は簡単にどのように私は私が必要なものを計算し、結果で取得するためにこれを使用することができ、その後、

for (i in 1:3){ 
    combn(4, i) 
next} 

で(4列のデータフレームを仮定して)すべての可能な組み合わせ/順列を取得することができますが、combinatを使用

1 2 3 4 
A AB ABC ABCD 
B AC ABD na 
C AD ACD na 
D BC BCD na 
na BD na na 
na CD na na 
+0

あなたは> = 2^40カウントを要求していますが、これは実現可能ではありません。私はそれらのコンボのほとんどは、とにかく、ゼロカウントを持つと思いますので、明示的にそれらを列挙せずに行うことができます。 – Frank

+0

'ID_1'は' B'、 'D'、' BD'、 'DB'と数えられますか? –

+0

すべての組み合わせと並べ替えが欲しいですか?あなたが必要とするすべてが組み合わせであるように見えます。 –

答えて

0

[OK]をのようなデータフレームは、私はこの問題を解決する方法を見つけたと思うが、それは(20列と18000行のデータセット上> 12H)スーパー遅いので、改善のための任意の提案は歓迎されています。

私が最初に続いて、このように

combi <- as.data.frame(t(colnames(dt))) 

for (i in 2:ncol(dt)){ 
    combi <- cbind.fill(combi, as.data.frame(combn(colnames(dt), i)), fill = NA) 
next} 

combnを使用して、すべての可能な組み合わせを計算列「ID」が削除された初期データテーブルを仮定すると、この

A B C D E F G H 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 NA 
1 1 1 1 1 1 1 1 
1 1 1 1 1 NA NA NA 
1 1 NA 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 NA 
NA 1 1 NA 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 NA 1 
NA 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 NA 1 1 1 
1 1 1 1 1 1 1 1 
1 1 NA NA 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 NA 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 NA 
1 1 1 1 1 1 1 1 
NA 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 NA 1 1 
1 1 1 1 1 1 1 1 
1 NA NA 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 NA 1 
1 1 1 1 NA 1 NA 1 
1 1 NA 1 1 1 NA 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 NA 
1 1 1 1 1 1 1 NA 
1 1 1 NA 1 1 1 NA 
1 1 1 1 1 1 1 1 
NA NA NA NA NA NA NA 1 

のように見えます最終結果の表を作成します。

final <- data.frame(group = apply(combi, 2 , function(x) length(which(x != ""))) , value = c(NA)) 

ラストン、私はちょうどfinalにこの

result <- subset(final, group == 1)[,2] 
for (i in 2:max(final[, 1])){ 
    result <- cbind.fill(result, subset(final, group == i)[,2], fill = NA) 
next} 

組み合わせテーブルcombiと計算の生成を行いたい、最終的な結果を得るには、各組み合わせ

for (i in 1:ncol(combi)){ 
    final[i, 2] <- nrow(dt[ , c(which(colnames(dt) %in% c(as.character(na.omit(combi[, i]))))), with = FALSE][!apply(dt[ , c(which(colnames(dt) %in% c(as.character(na.omit(combi[, i]))))), with = FALSE] == "", 1, all),]) 
next} 

に存在するIDの数をしている計算しますボトルネック、それは小さなデータのためにうまく動作しますが、私が言ったように、それはキックオフマシンでも大きなデータセットで信じられないほど遅いです。

関連する問題