打破内循环

时间:2011-12-09 05:22:59

标签: r if-statement for-loop break

我试图将一个循环嵌套在另一个循环中并突破内循环,并在满足条件时继续使用外循环。我的数据框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个零的列向量,后跟3个1。但是上面的代码并没有在内部循环中的break语句之后跳过命令。

感谢任何帮助,找出这里有什么问题。

3 个答案:

答案 0 :(得分:5)

问题是如果TRS的第一个行匹配,内部循环只会中断。为了使你的代码工作,你必须这样做:

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]])

答案 1 :(得分:4)

在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

答案 2 :(得分:4)

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

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