【问题标题】:Break out of the inner loop跳出内循环
【发布时间】:2012-01-16 12:08:21
【问题描述】:

我试图将一个循环嵌套在另一个循环中,并在满足条件时跳出内循环并继续使用外循环。我的数据框 a_2011TRS 具有以下形式:

a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))

for (i in 1:nrow(a_2011))
{
  a_2011$City[i] <- 1
  for (j in 1:nrow(TRS))
  {
    if ( as.character(a_2011[i,1]) ==  as.character(TRS[j,1]) )
    {
      break
    }
    else
    {
      a_2011$City[i] <- 0
    }
  }
}

a_2011$City 的期望输出是一个由 2 个 0 后跟 3 个 1 组成的列向量。但是上面的代码并没有跳过内部循环中 break 语句之后的命令。

如果能帮助您找出问题所在,我们将不胜感激。

【问题讨论】:

    标签: r if-statement for-loop break


    【解决方案1】:

    您根本不需要循环。这就是ifelse 的用途。

    a_2011$City <- ifelse( a_2011[,1] %in% TRS[,1], 1, 0)
    

    【讨论】:

    【解决方案2】:

    问题在于,只有当 TRS 的 first 行匹配时,内部循环才会中断。要使您的代码正常工作,您必须这样做:

    a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
    TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
    
    for (i in 1:nrow(a_2011))
    {
        flag <- 0
        for (j in 1:nrow(TRS))
        {
            if ( as.character(a_2011[i,1]) ==  as.character(TRS[j,1]) )
            {
                 flag <- 1
                 break
            }
        }
        a_2011$City[i] <- flag
    }
    

    您可以像这样消除对内部循环的需要:

    a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
    TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
    
    for (i in 1:nrow(a_2011))
    {
        flag <- any(as.character(a_2011[i,1]) ==  as.character(TRS[,1]))
        a_2011$City[i] <- as.numeric(flag)
    }
    

    ..然后为了进一步简化,你也可以去掉外循环:

    a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
    TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
    
    a_2011$City <- as.numeric(a_2011[[1]] %in% TRS[[1]])
    

    【讨论】:

      【解决方案3】:

      在 R 中你不需要循环来实现这一点。

      a_2011<- c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1")
      TRS   <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33")
      
      city  <- rep(0, 5)
      city[a_2011 %in% TRS] <- 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2020-05-21
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多