2017-09-01 104 views
1

我需要一些帮助来计算数据帧列的所有组合和排列。 我df看起来像这样(真正的一个具有40个列和行15000+)数据帧列的组合和排列

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 

当第一列包含一个唯一的ID,并且柱2:40+含有任1(存在)或NA(缺席)。

现在我需要知道每个组合和排列有多少个ID“存在” AB,AC,AD,BC ..... ABC,ABD ..... ABCDE,ABCDF ....等等。

使用combinat我可以很容易地通过

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

但随后检索所有可能的组合/置换(假设4列的数据帧),我怎么可以用它来计算我需要什么,并获得结果像

数据帧
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

好吧,我想我找到了一种方法来解决这个问题,但它是超慢的(> 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计算是瓶颈,它适用于小数据,但正如我所说的,即使在屁股机器上,大数据集的速度也非常慢。