【问题标题】:Weird R nested for loop behavior奇怪的 R 嵌套 for 循环行为
【发布时间】:2013-09-09 16:20:01
【问题描述】:

我有以下代码:

for(i in(1:5) )
{
    for(j in ( (i+1) :5) )
{
    cat (i,", ",j,"\n")

}
}

我的期望是,它将列出从 1 到 5 的所有数字对。但是,当我运行上述 R 脚本时,我得到以下结果。

1 ,  2 
1 ,  3 
1 ,  4 
1 ,  5 
2 ,  3 
2 ,  4 
2 ,  5 
3 ,  4 
3 ,  5 
4 ,  5 
5 ,  6 
5 ,  5 

最后两行完全让我感到困惑。如果这是边界包含/排除的情况,6 总是会在 1,2,3,4 之后打印,但它只会在 5 之后发生。此外,最后一对 5,5 也没有任何意义。

【问题讨论】:

  • 如果我理解你的要求 - 你想要 1,1; 1,2; 1,3... 5,5;那么你的内循环应该是for(j in ( (i) :5) )吗?
  • 我其实不想要 1:1,而是 1:2。也就是说,没有相同的值对。

标签: r for-loop nested-loops


【解决方案1】:

它完全按照你的要求去做:

6:5
#[1] 6 5

?`:`

了解更多信息。

【讨论】:

  • 我明白了,我将如何实现我的实际意图?
  • @ShamimHafiz loop i 从 1 到 4
  • 我想我明白了,我将外部限制更改为 4。有没有更好的方法来做到这一点?
  • @ShamimHafiz 如果你只想要数字 - 做combn(c(1:5), 2)
【解决方案2】:

我认为你的循环应该是,

for(i in(1:5) )
{
  for(j in ( (i) :5) )
  {
    cat (i,", ",j,"\n")

  }
}

1 ,  1 
1 ,  2 
1 ,  3 
1 ,  4 
1 ,  5 
2 ,  2 
2 ,  3 
2 ,  4 
2 ,  5 
3 ,  3 
3 ,  4 
3 ,  5 
4 ,  4 
4 ,  5 
5 ,  5 

更新

为了获得类似于combn 的结果,只需一个if(·) 条件,如下所示:

for(i in(1:5) )
{
  for(j in ( (i) :5) )
  {
    if(i!=j){
      cat (i,", ",j,"\n")
    }

  }
}

这样可以避免在i 等于j 时打印值(我认为这就是你所说的“重复值对”)。

【讨论】:

  • 不是我想要的,我不想要重复的值对。
  • @ShamimHafiz 我想我明白了你的意思,请参阅更新。 :D
【解决方案3】:

你可以用这个得到它:

t(combn(5, 2))

结果:

      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

【讨论】:

    【解决方案4】:

    尝试写 if 状态。 像

    for(i in(1:5) )
    {
        if (i < 4) {
            for(j in ( (i+1) :5) )
            {
                cat (i,", ",j,"\n")
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2016-11-14
      • 2014-12-09
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      相关资源
      最近更新 更多