【问题标题】:Possible combinations using R使用 R 的可能组合
【发布时间】:2016-06-12 16:18:15
【问题描述】:

我已经编辑了我的问题并更改了脚本中的某些行,以便清楚地找到我可以获得输出 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^20 个可能的布尔组合中,恰好有 1 个为真。当然,您不需要程序来确定这一点。
  • 谢谢 Gregor 和 moh3n。这不是家庭作业,这是我在这里给出的一个例子。我参与编写一个脚本来显示给定 n 个基因如何在不同的组合中相互作用。我不想将输出显示为真值表,我只想知道次数,1 或0 作为输出。正如我所看到的,只有一次,我会得到输出 1,因为我使用了 AND 运算符,当我使用 AND , OR 时,我得到 1 和 0 的次数作为输出。谢谢 moh3n 和 Gregor 处理我的脚本

标签: r logical-operators boolean-logic truthtable


【解决方案1】:

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"

在您的问题中,您经常使用&amp;&amp;&amp;&amp; 适合比较长度为 1 的东西。使用&amp; 进行矢量化比较,因此您不需要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 的组合数量。(或者它们都具有特定值。)我不会在这里给出答案,因为我怀疑这是为了家庭作业,但我会说你不需要编写一行代码来找出它。如果您了解“所有可能的组合”的世界是什么,那么答案在逻辑上就会非常清楚。

【讨论】:

    【解决方案2】:

    我想这就是你想要的:

    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 行中的一行中找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2020-02-22
      相关资源
      最近更新 更多