好吧,我想我找到了一種方法來解決這個問題,但它是超慢的(> 12小時20列和18000行的數據集),所以任何改進建議,歡迎。
假設其中列「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
我第一以這種方式使用combn
計算所有可能的組合
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}
然後我爲最終結果創建一個表格
final <- data.frame(group = apply(combi, 2 , function(x) length(which(x != ""))) , value = c(NA))
Las T,我計算的ID存在於每個組合的數量
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}
爲了得到最後的結果我想我只是這樣做
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
的產生和final
計算是瓶頸,它適用於小數據,但正如我所說的,即使在屁股機器上,大數據集的速度也非常慢。
你要求> = 2^40計數,這是不可行的,我猜。我猜這些組合中的大部分都會有零計數,無論如何,也許你可以在沒有明確列舉的情況下進行計數。 – Frank
也'ID_1'計爲'B','D','BD'和'DB'? –
你確定你想要所有的組合和排列?在我看來,所有你需要的是組合。 –