2016-06-12 2 views
-3

Я редактировал мой вопрос и изменил некоторые строки в моем сценарии, чтобы понять, чтобы найти число раз я могу получить выход 1 или 0.Возможные комбинации с использованием R

Я 19 variables.I пытался возможные комбинации этих 19 переменных для выдачи двоичного выхода 0 или 1, т.е. 2, на мощность 19 (5, 24, 288). Но я не смог отобразить таблицу истинности в R для всех комбинаций 5,24,288 из-за ограниченного пространства памяти. Есть ли способ найти количество комбинаций, которые дают выходные 1 и 0. Ниже приведен сценарий, где я дал следующие входы, используя логические логические И И ИЛИ. Пожалуйста, дайте мне идеи или предложения, чтобы найти число раз я могу получить значение 0 или 1 в качестве выхода

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

Ваш вопрос немного расплывчатый. можете ли вы опубликовать свой окончательный желаемый результат? – 989

+0

Это домашнее задание? – Gregor

+3

Точно 1 из 2^20 возможных булевых комбинаций - все верно. Конечно, для этого вам не нужна программа. –

ответ

2

1048576 не абсурдно большой. Если все, что вы хотите являются 20 0/1 столбцов занимает около 80 Мб, если вы используете целые числа:

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" 

В своем вопросе вы используете && много. && подходит для сравнения длины 1. Используйте & для векторизованного сравнения, так что вам не нужен цикл for.

Например:

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. 

Похоже, вы действительно после того, как число комбинаций, где все значения равны 1. Я не буду давать (или там, где все они имеют определенные значения.) ответьте здесь, потому что я подозреваю, что это для домашней работы, но я скажу, что вам не нужно программировать одну строку кода, чтобы найти это. Если вы понимаете, что представляет собой вселенная «все возможные комбинации», ответ будет достаточно ясным логически.

1

Я думаю, это то, что вы хотите:

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) 

Хотя, как подчеркивает другие, key могут быть найдены только в одном ряду из всех 1048576 строк.