2017-09-01 146 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計算是瓶頸,它適用於小數據,但正如我所說的,即使在屁股機器上,大數據集的速度也非常慢。