Ich habe eine spärliches binären data.frame
, die wie dieseWählen Teilmenge von Spalten, die ein Kriterium in R minimieren
set.seed(123)
dat <- as.data.frame(matrix(rep(round(runif(40,0,0.9),0),5),ncol = 20))
# > dat
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
# 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
# 2 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
# 3 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
# 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 5 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
# 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 7 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0
# 8 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
# 9 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
# 10 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
I, die die Anzahl der Nullen erhalten minimieren Nötige zu finden, die 3 Spalten aussehen, wenn ich rowSums
auf den Teilnehmer anrufen Säulen.
Beispiel:
# > rowSums(dat[,1:3])
# [1] 2 2 2 3 2 2 0 2 0 1
#
# > rowSums(dat[,2:4])
# [1] 3 2 3 3 1 2 1 1 0 1
hier, wenn ich rowSums
auf den ersten 3 Spalten nennen erhalte ich 2 Nullen, während, wenn ich rowSums
auf Spalten nennen 2:4
ich nur eine 0
bekommen, so würde die zweite Lösung bevorzugt werden .
Natürlich, ich brauche nicht die Spalten nebeneinander zu sein, wenn ich rowSums
anwenden, so dass ich alle möglichen Kombinationen erforschen müssen (zB: Ich rowSums
auch den Fall ov V1+V5+V17
, zu prüfen, wollen .. .), und wenn es mehrere "optimale" Lösungen gibt, ist es in Ordnung für mich, nur einen von ihnen zu behalten.
Beachten Sie, dass meine echte data.frame
220.000 Zeilen x 200 Spalten ist, also brauche ich einen effizienten Ansatz in Bezug auf Zeit/Speicherverbrauch.
Danke soviel für Ihre Antwort, Sie waren sehr hilfreich und ich wäre nie zu einer Lösung wie Ihrer gekommen. Ihre Funktion arbeitet mit 'r = 3', aber leider ist sie zu langsam mit 'r = 5', was der Parameter ist, den ich brauche.Ich habe es in der Frage nicht geschrieben, weil ich es nicht für kritisch gehalten hätte, aber in der Tat, denn mit r = 3 haben wir 1,3 Millionen mögliche Kombinationen, während mit r = 5 diese Zahl steigt auf ~ 2,5 ** Milliarden ** (fast 2000-mal größer). Entschuldige mich für den Fehler. Wenn Sie einen Weg sehen, die Funktion zu verbessern, wäre das großartig. Ansonsten, danke trotzdem! – hellter
@heller Sie sind herzlich willkommen. Sind Sie aus Neugierde in der Lage gewesen, irgendeine Lösung zu finden, die den "r = 5" -Fall in einer relativ kurzen Zeit bewältigen kann? – bgoldst
Ich denke es durch, aber ich bin noch nicht zu einer Lösung gekommen, und ich sehe keinen einfachen Weg, dies zu tun .. – hellter