【发布时间】: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