我想创建一个长度为二进制向量的所有可能组合,以及行中n > 2最大数量为1s 的属性2.
例如:
如果n=4,答案是:
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
1 0 0 0
1 0 0 1
1 0 1 0
1 1 0 0
Run Code Online (Sandbox Code Playgroud)
这有效,但随着n变大(n> 20),内存非常密集且速度很慢:
n <- 4
m <- expand.grid(rep(list(0:1),n))
m <- m[rowSums(m)<3,]
Run Code Online (Sandbox Code Playgroud)
我怎样才能更有效地做到这一点?
答案:
*基于Marat Talipov和akrun解决方案的组合
n=4
z=rep(0,n)
rbind(unname(z), t(combn(0:n,2, FUN=function(k) {z[k]=1;z})))
Run Code Online (Sandbox Code Playgroud)
此算法可能比基于以下内容的算法更有效expand.grid:
n <- 3
z <- rep(0,n)
answer <- t(apply(combn(0:n,2),2,function(k) {z[k]=1;z}))
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 1 0
# [3,] 0 0 1
# [4,] 1 1 0
# [5,] 1 0 1
# [6,] 0 1 1
Run Code Online (Sandbox Code Playgroud)
[编辑]我注意到我的原始解决方案错过了一个简单的全零的情况,可以很容易地修复:
rbind(unname(z),answer)
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 0
# [2,] 1 0 0 0
# [3,] 0 1 0 0
# [4,] 0 0 1 0
# [5,] 0 0 0 1
# [6,] 1 1 0 0
# [7,] 1 0 1 0
# [8,] 1 0 0 1
# [9,] 0 1 1 0
# [10,] 0 1 0 1
# [11,] 0 0 1 1
Run Code Online (Sandbox Code Playgroud)