【问题标题】:Create all possible combiations of 0,1, or 2 "1"s of a binary vector of length n创建长度为 n 的二进制向量的 0、1 或 2 个“1”的所有可能组合
【发布时间】:2015-01-07 18:48:58
【问题描述】:

我想创建长度为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})))

【问题讨论】:

  • @akrun 我认为我的问题是随着 n 变大,expand.grid 不必要地创建将在下一步中删除的行。最好不要一开始就创建这些向量。
  • 对于初学者来说,Reduce("+", m)rowSums(m) 效率要高很多倍
  • 准确的两个 ;) library(multcomp); n
  • @verigolfer 更大数据集的另一个选项是combnPrim,来自library(grBase)。与combn相比非常快请查看stackoverflow.com/questions/26828301/faster-version-of-combn/…

标签: r


【解决方案1】:

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

【讨论】:

  • 做得很好。我用 n=30 试过这个,效果很好。我的方法使用 n=30 使我的 R 会话崩溃。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2011-02-02
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多