具有不兼容值的双循环

时间:2013-12-02 13:48:15

标签: r

我想实现以下for循环:

for (start in c(1,2,3,4,5,6,7,8,9,10)){
for (to in c(1,2,3,4,5,6,7,8,9,10)){

runif(100,start,to)

}
}

当然,只有当start小于或等于to

时才会有效

有没有办法只运行这种情况的情况?

注意:这是一个简化的情况,请不要提供废除for循环的解决方案。

4 个答案:

答案 0 :(得分:0)

为什么不:

for (start in c(1,2,3,4,5,6,7,8,9,10)){
  for (to in c(1,2,3,4,5,6,7,8,9,10)){
    if( start < to ){ runif(100,start,to)}

  }
}

由于您没有打印或将结果分配给任何内容,所以不会发生太多事情,但至少您现在不会收到警告消息。

rnum<-numeric(0)
for (start in c(1,2,3,4,5,6,7,8,9,10)){
  for (to in c(1,2,3,4,5,6,7,8,9,10)){
    rnum <- c(rnum, if( start < to ){ runif(5,start,to)} )
   }
 }
 str(rnum)
# num [1:225] 1.6 1 1.57 1.75 1.11 ...
 sum(is.na(rnum))
#[1] 0

另一种方法是让内循环索引从大于start的下一个整数开始(并跳过测试):

rnum<-numeric(0)
for (start in c(1,2,3,4,5,6,7,8,9)){
    for (to in (start+1):10){
        rnum <- c(rnum,  runif(5,start,to) )
    }
  }
str(rnum)
sum(is.na(rnum))

答案 1 :(得分:0)

改变中间线:

 if(to>start)runif(100,start,to)

答案 2 :(得分:0)

我仍然不明白你想做什么以及为什么你真的想要使用for循环,但是:

for (start in c(1,2,3,4,5,6,7,8,9)){
    for (to in ((start+1):10)){
        runif(100,start,to)
    } 
}

答案 3 :(得分:0)

如果您的可能的起始值和结束值实际上相等(如您的示例中所示),则可以使用combn

#using a loop
start_to <- combn(1:10,2)
n <- 2
set.seed(42)
randoms <- sapply(as.data.frame(start_to), function(x) runif(n, 
                                                             min=x[1], max=x[2]))

#without a loop
set.seed(42)
randoms2 <- matrix(runif(n*ncol(start_to), 
                           min=rep(start_to[1,], each=n), 
                           max=rep(start_to[2,], each=n)),
                   nrow=n)