[英]How can I avoid having 10 nested loops in R?
我正在尝试在R中执行以下操作:获取该类型的每个向量
c(a1, a2, ... , a10)
,其中
a1 < a2 < ... < a10
,以及
a1, ... , a10 in c(1:100)
使用嵌套循环可以实现
for(a1 in 1:90) {
for(a2 in (a1+1):91) {
for(a3 in (a2+1):92) {
等等...
但是您会理解为什么我宁愿避免该解决方案。 此外,我希望能够同时使a的数量和其范围成为参数,以便获得例如(a1, a2, a3) in 1:10
有没有人对我如何做到这一点有任何想法? 请记住,我确实需要遍历(a1:a10)
所有可能组合,以便能够在以后的函数中使用结果。
让我们将问题简化为从1:5
得出的a1 < a2 < a3
:
combn(5, 3)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 1 1 1 1 1 1 2 2 2 3
#[2,] 2 2 2 3 3 4 3 3 4 4
#[3,] 3 4 5 4 5 5 4 5 5 5
那有多少种组合?
choose(5, 3)
#[1] 10
如上所述的问题有多少种组合?
choose(100, 10)
#[1] 1.731031e+13
太多了,无法全部计算出来。
像这样?
sapply(0:10,"+",1:90)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
# [1,] 1 2 3 4 5 6 7 8 9 10 11
# [2,] 2 3 4 5 6 7 8 9 10 11 12
# [3,] 3 4 5 6 7 8 9 10 11 12 13
# [4,] 4 5 6 7 8 9 10 11 12 13 14
每列都是您的向量。 第1列是1-90,第2列是2-91,...,第11列是11-100。
您将有很多组合!
这是一个实现它的功能,但是如果不在计算机上长时间运行,使用1:100最多只能得到4个数字。
getcombinations<-function(size, maxn){
as.data.frame(t(combn(seq(from=1,to=maxn),size)))
}
它通过使用combn
从seq(1:maxn)
中获取大小的所有组合,然后重新排列一点来工作。
getcombinations(3,4)
V1 V2 V3
1 1 2 3
2 1 2 4
3 1 3 4
4 2 3 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.