创建长度为n的二进制向量的0,1或2" 1" s的所有可能组合

时间:2015-01-07 18:48:59

标签: r

我想创建长度为n > 2的二进制向量的所有可能组合,其中该行的1的最大数量为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

这很有用,但是当n变大(n> 20)时,内存非常密集且速度很慢:

n <- 4
m <- expand.grid(rep(list(0:1),n))
m <- m[rowSums(m)<3,]

如何更有效地完成这项工作?

答案:
*基于Marat Talipov和akrun的解决方案的组合

n=4
z=rep(0,n)
rbind(unname(z), t(combn(0:n,2, FUN=function(k) {z[k]=1;z})))

1 个答案:

答案 0 :(得分:6)

此算法可能比基于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

[编辑]我注意到我的原始解决方案错过了一个全零的小案例, 这很容易修复:

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