[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の数をしている計算しますボトルネック、それは小さなデータのためにうまく動作しますが、私が言ったように、それはキックオフマシンでも大きなデータセットで信じられないほど遅いです。
あなたは> = 2^40カウントを要求していますが、これは実現可能ではありません。私はそれらのコンボのほとんどは、とにかく、ゼロカウントを持つと思いますので、明示的にそれらを列挙せずに行うことができます。 – Frank
'ID_1'は' B'、 'D'、' BD'、 'DB'と数えられますか? –
すべての組み合わせと並べ替えが欲しいですか?あなたが必要とするすべてが組み合わせであるように見えます。 –