我已经编辑了我的问题并更改了我的脚本中的某些行,以便清楚地找到输出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)
答案 0 :(得分:2)
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行中的一行中找到。