2016-06-12 11 views
-3

Ich habe meine Frage bearbeitet und geändert bestimmte Zeilen in meinem Skript, deutlich zu machen, die Anzahl der Male zu finden ich die Ausgabe 1 oder 0 bekommenMögliche Kombinationen mit R

Ich habe 19 variables.I versucht die möglichen Kombinationen dieser 19 Variablen, um eine binäre Ausgabe von 0 oder 1, dh 2, der Potenz von 19 (5,24,288) zu geben. Aber ich konnte die Wahrheitstabelle in R nicht für alle 5,24,288 Kombinationen anzeigen, wegen des begrenzten Speicherplatzes. Gibt es eine Möglichkeit, die Anzahl der Kombinationen zu finden, die den Ausgang 1 und 0 ergeben. Unten ist das Skript, wo ich die folgenden Eingaben mit dem logischen Gatter AND und OR gegeben habe. Bitte geben Sie mir Ideen oder Vorschläge an, wie oft zu finden I-Werte 0 oder 1 als Ausgangs

n <- 19 
    l <- rep(list(0:1), n) 
    inputs <- expand.grid(l) 
    len <-dim(inputs) 
    len <-len[1] 
    output <- 1; 
    for(i in 1:len) 
    { 
    if((inputs[i,1] == 1 & inputs[i,2] == 1 & inputs[i,3] == 1 & (inputs[i,4] == 1 & inputs[i,5] == 1 | inputs[i,6] == 1 & inputs[i,7] == 0)) | (inputs[i,1] == 1 & inputs[i,2] == 1 & inputs[i,8] == 1 & inputs[i,9] == 1) | (inputs[i,1] == 1 & inputs[i,10] == 0 & inputs[i,11] == 0) |(inputs[i,1] == 1 & inputs[i,12] == 1 & inputs[i,13] == 1 & inputs[i,14] == 1) | (inputs[i,1] == 1 & inputs[i,15] == 1 & inputs[i,16] == 1) | (inputs[i,1] == 1 & inputs[i,17] == 0) | (inputs[i,1] == 1 & inputs[i,18] == 1 & inputs[i,19] == 1)){ 
    output[i] <- 1 
    } 
    else 
    { 
    output[i] <- 0 
    } 
    } 
    data <- cbind(inputs, output) 
    write.csv(data, "data.csv", row.names=FALSE) 
+3

Ihre Frage ist ein bisschen vage. Kannst du deine endgültige gewünschte Ausgabe posten? – 989

+0

Ist das Hausaufgaben? – Gregor

+3

Genau 1 der 2^20 möglichen Booleschen Kombinationen ist wahr. Sicherlich brauchen Sie kein Programm, um das festzustellen. –

Antwort

2

1048576 ist nicht unsinnig groß werden kann. Wenn alles, was Sie die 20 0/1 Spalten wollen dauert es etwa 80 Mb, wenn Sie ganze Zahlen verwenden:

x = replicate(n = 20, expr = c(0L, 1L), simplify = FALSE) 
comb = do.call(expand.grid, args = x) 

dim(comb) 
# [1] 1048576  20 

format(object.size(comb), units = "Mb") 
# [1] "80 Mb" 

In Ihrer Frage benutzen Sie && viel. && ist gut für den Vergleich etwas der Länge 1. Verwenden Sie & für einen vektorisierten Vergleich, so dass Sie keine for Schleife benötigen.

Zum Beispiel:

y = matrix(c(1, 1, 0, 0, 1, 0, 1, 0), nrow = 4) 
y[, 1] & y[, 2] # gives the truth table for & applied across columns 
# no for loop needed 
# R will interpret 0 as FALSE and non-zero numbers as TRUE 
# so you don't even need the == 1 and == 0 parts. 

Es scheint, wie Sie wirklich nach der Anzahl der Kombinationen sind, wo alle Werte sind: 1. Ich werde nicht geben (Oder, wo sie alle spezifischen Werte haben.) weg die Antwort hier, weil ich vermute, dass dies für Hausaufgaben ist, aber ich werde sagen, dass Sie nicht eine einzige Zeile Code programmieren müssen, um das herauszufinden. Wenn Sie verstehen, was das Universum aller möglichen Kombinationen ist, wird die Antwort logisch klar sein.

1

Ich denke, das ist das, was Sie wollen:

key <- c(1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1) # based on your if condition 
inputs <- expand.grid(rep(list(0:1), 20)) 
len <- nrow(inputs) 

output <- sapply(1:len, function(i) all(inputs[i,]==key)) 
data <- cbind(inputs, as.numeric(output)) 
write.csv(data, "data.csv", row.names=FALSE) 

Obwohl, wie von anderen hervorgehoben wird, kann key nur in einer Zeile in der Liste aller 1048576 Zeilen gefunden werden.