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