我正在寻找一种智能方法来生成长度为n的两个向量的所有成对组合,其中只有一个值不为零 .
现在我正在做一些非常绝望的事情,通过每个组合循环:n < - 3; z < - rep(0,n); m < - apply(combn(1:n,1),2,function(k){z [k] = 1; z})但是没有循环必须有更好的方法吗?
这就是我所追求的n = 3:
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[1,] 1 0 0
[2,] 0 0 1
[1,] 0 1 0
[2,] 1 0 0
[1,] 0 1 0
[2,] 0 0 1
[1,] 0 0 1
[2,] 1 0 0
[1,] 0 0 1
[2,] 0 1 0
非常感谢帮忙 .
2 回答
像这样的东西?
精明的读者会注意到这个问题可以简化为:“如何生成 permutations 的所有成对 permutations ?”通过这种方式查看,我们可以避免最初处理二进制向量并将其保存到最后一步 .
使用基本R函数
intToBits
,this answer到问题How to convert integer numbers into binary vector?,以及任何可以生成特定长度排列的函数(有很多软件包:gtools::permutations
,RcppAlgos::permuteGeneral
,iterpc
和arrangements::permutations
),我们可以在一个中获得所需的结果线 .推广很容易 .
更新
我只是张贴这个来指出@Suren的答案是如何正确的 .
从评论中的对话中,您会看到@Suren的解决方案在组数增加时没有给出正确的结果("I am also trying to get groupings of three instead of 2 (or any number)"和"This is cutting off some solutions") .
似乎@ Suren的回答用
g = 2
给出了正确的结果 . 这是如此,因为1:n choose 2
的排列等于1:n choose 2
的组合与n:1 choose 2
的组合(注意1:n
被颠倒) . 这正是@ Suren的答案正在做的事情(即生成组合选择2,以相反的顺序编写它们并组合) .使用OP中的给定示例,它以不同的顺序给出相同的结果:
让我们用
g = 3
和n = 4
测试一下 .