使用R的可能组合

时间:2016-06-12 16:18:16

标签: r logical-operators boolean-logic truthtable

我已经编辑了我的问题并更改了我的脚本中的某些行,以便清楚地找到输出1或0的次数。

我有19个变量。我尝试了这19个变量的可能组合,给出二进制输出0或1,即2到19的幂(5,24,288)。但由于存储空间有限,我无法在R中为所有5,24,288组合显示真值表。有没有办法找到给出输出1和0的组合数。下面是脚本,我使用逻辑门AND和OR给出了以下输入。请给我一些想法或建议,以找出我可以获得值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)

2 个答案:

答案 0 :(得分:2)

1048576并不荒谬。如果你想要的只是20 0/1列,如果你使用整数,它需要大约80 Mb:

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 :(得分: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行中的一行中找到。