R 查找0和x27的所有组合;s和1';s,具体数字为1';s

R 查找0和x27的所有组合;s和1';s,具体数字为1';s,r,combinations,R,Combinations,我想找到一个包含0和1所有可能组合的矩阵。这些可能组合的条件不是单个可能性的信誉,并且对于每个可能向量都有指定数量的1。例如,我有多个对象n=6,多个样本r=3,这意味着6个插槽,在每个插槽中(可能的组合),有多个1的=3。使用R中的choose()函数,我们可以找到20个可能性 choose(n=6,k=3) #calculate the number of combinations without replacement/repetition 所有可能组合的理想输出矩阵如下: 1, 1 1

我想找到一个包含0和1所有可能组合的矩阵。这些可能组合的条件不是单个可能性的信誉,并且对于每个可能向量都有指定数量的1。例如,我有多个对象n=6,多个样本r=3,这意味着6个插槽,在每个插槽中(可能的组合),有多个1的=3。使用R中的choose()函数,我们可以找到20个可能性

choose(n=6,k=3) #calculate the number of combinations without replacement/repetition
所有可能组合的理想输出矩阵如下:

1, 1 1 1 0 0 0
2, 1 1 0 1 0 0
3, 1 1 0 0 1 0
4, 1 1 0 0 0 1
5, 1 0 1 1 0 0
6, 1 0 1 0 1 0
7, 1 0 1 0 0 1
8, 0 1 1 1 0 0 
9, 0 1 1 0 1 0
10,0 1 1 0 0 1
11,0 0 1 1 1 0
12,0 0 1 1 0 1
14,0 0 0 1 1 1 
15,1 0 0 1 1 0
16,0 1 0 1 1 0 
17,1 0 0 1 0 1
18,1 0 0 0 1 1 
这些可能性应该等于20,但我发现只有18。 我将把这个概念应用于大量的数据集,例如,不是6个插槽,而是3个1,分别是200个插槽和100个1。因此,我需要一个算法或R中的内置函数来提供输出。 谢谢

您可以编写一个函数:

fun=function(n,m)t(combn(n,m,function(x)replace(numeric(n),x,1)))
fun(6,3
您可以编写一个函数:

fun=function(n,m)t(combn(n,m,function(x)replace(numeric(n),x,1)))
fun(6,3

这只是多集
0:1
的排列。有两个库能够有效地处理这些问题:
RcppAlgos
(我是作者)和
安排

RcppAlgos::permuteGeneral(1:0, freqs = c(3, 3))

arrangements::permutations(x = 1:0, freq = c(3, 3))
两者都给出了期望的结果。您将注意到传递的向量是按降序排列的(即
1:0
)。之所以如此,是因为这两个库都按字典顺序生成输出

如评论中所述,对于您的真实数据,由于结果数量太多,发布的任何解决方案都不起作用

RcppAlgos::permuteCount(0:1, freqs = c(100,100))
[1] 9.054851e+58

arrangements::npermutations(x = 0:1, freq = c(100, 100), bigz = TRUE)
Big Integer ('bigz') :
[1] 90548514656103281165404177077484163874504589675413336841320
由于一次生成如此数量的数据是不可行的,这两个包,
安排
RCPPALGO
都提供了替代方法,可以解决更大的问题

安排 对于包
排列
,您可以设置一个迭代器,允许用户一次生成组合/排列n,从而避免生成所有组合/排列的开销

由于这些块是独立生成的,因此可以轻松地并行生成和分析:

library(parallel)
mclapply(seq(1,20,5), function(x) {
    a <- permuteGeneral(1:0, freqs = c(3,3), lower = x, upper = x + 4)
    ## Do some analysis
}, mc.cores = detectCores() - 1)
库(并行)
mclappy(seq(1,20,5),函数(x){

a这只是多集
0:1
的排列。有两个库能够有效地处理这些问题:
RcppAlgos
(我是作者)和
排列

RcppAlgos::permuteGeneral(1:0, freqs = c(3, 3))

arrangements::permutations(x = 1:0, freq = c(3, 3))
这两个库都给出了所需的结果。您会注意到传递的向量是降序的(即
1:0
)。这是因为这两个库都按字典顺序生成输出

如评论中所述,对于您的真实数据,由于结果数量太多,发布的任何解决方案都不起作用

RcppAlgos::permuteCount(0:1, freqs = c(100,100))
[1] 9.054851e+58

arrangements::npermutations(x = 0:1, freq = c(100, 100), bigz = TRUE)
Big Integer ('bigz') :
[1] 90548514656103281165404177077484163874504589675413336841320
由于一次生成如此数量的数据是不可行的,这两个包,
安排
RCPPALGO
都提供了替代方法,可以解决更大的问题

安排 对于包
排列
,您可以设置一个迭代器,允许用户一次生成组合/排列n,从而避免生成所有组合/排列的开销

由于这些块是独立生成的,因此可以轻松地并行生成和分析:

library(parallel)
mclapply(seq(1,20,5), function(x) {
    a <- permuteGeneral(1:0, freqs = c(3,3), lower = x, upper = x + 4)
    ## Do some analysis
}, mc.cores = detectCores() - 1)
库(并行)
mclappy(seq(1,20,5),函数(x){

感谢Onyanbu,非常棒,非常完美,回答非常迅速。这似乎是一个非常聪明的答案,所以我需要了解它是如何工作的,我指的是函数的每个部分。从
combn(6,3)开始
然后你会看到发生了什么感谢Onyanbu,很棒,工作完美,回答非常快。这似乎是一个非常聪明的答案,所以我需要了解它是如何工作的,我是指函数的每个部分。从
combn(6,3)开始
然后你会看到发生了什么这些不是组合。它们是排列,因为顺序很重要。还要注意的是,对于真实的数据集,由于结果数量巨大,你可能不得不改变方法:
RcppAlgos::permuteCount(0:1,freqs=c(100100))=9.054851e+58
。这些不是组合。它们是排列,因为顺序很重要。还要注意,对于实际数据集,由于结果数量巨大,您可能必须更改方法:
RcppAlgos::permuteCount(0:1,freqs=c(100100))=9.054851e+58