2017-09-01 4 views
1

Ich würde etwas Hilfe benötigen, um die ganze Kombination und Permutation der Datenrahmenspalte zu berechnen. Mein df sieht wie folgt aus (die echte 40+ Spalten und Reihen 15000+ hat)Kombination und Permutation von Datenrahmenspalten

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 

Wo die erste Spalte eine eindeutige Kennung enthält, und Spalte 2: 40+ enthalten entweder 1 (vorhanden) oder NA (abwesend).

Jetzt müsste ich wissen, wie viele IDs für jede Kombination und Permutation "vorhanden" sind AB, AC, AD, BC ..... ABC, ABD ..... ABCDE, ABCDF .... und so weiter.

combinat Verwendung Ich kann alle möglichen Kombinationen/Permutation leicht abrufen, indem

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

(ein 4-Säulen-Datenrahmen vorausgesetzt) ​​Aber dann, wie kann ich diese verwenden, um zu berechnen, was ich brauche und die Ergebnisse zu erhalten, in ein Datenrahmen wie

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

Sie fragen nach> = 2^40 zählt, was nicht machbar ist, denke ich. Ich nehme an, die meisten dieser Combos haben sowieso keine Zählung, also kannst du vielleicht auf sie verzichten. – Frank

+0

Gehört 'ID_1' auch zu 'B',' D', 'BD' und' DB'? –

+0

Sind Sie sicher, dass Sie alle Kombinationen und Permutationen möchten? Sieht für mich aus wie alles, was du brauchst, sind Kombinationen. –

Antwort

0

Ok, ich glaube, ich einen Weg, dies zu lösen gefunden, aber es ist super langsam (> 12 h auf einem Datensatz von 20 Spalten und 18000 Zeilen), so dass jeder Vorschlag für Verbesserungen sind willkommen .

ein anfängliches Datentabelle Unter der Annahme, wo die Spalte „ID“ entfernt wurde, und sieht so aus

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 

I zuerst alle möglichen Kombination combn auf diese Weise unter Verwendung berechnen

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} 

dann Ich erstelle eine Tabelle für das Endergebnis

final <- data.frame(group = apply(combi, 2 , function(x) length(which(x != ""))) , value = c(NA)) 

Las t, berechne ich die Anzahl der IDs, die in jeder Kombination

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} 

die endgültigen Ergebnisse zu bekommen Ich will ich nur dieses

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} 

Die Erzeugung der Kombinationen Tabelle combi und die Berechnung auf final sind der Flaschenhals, es funktioniert gut für kleine Daten, aber wie gesagt, es ist unglaublich langsam auf große Datenmenge selbst auf einer kick-ass-Maschine.

Verwandte Themen