好吧,我想我找到了一种方法来解决这个问题,但它是超慢的(> 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'? –
你确定你想要所有的组合和排列?在我看来,所有你需要的是组合。 –