Вырваться из внутреннего цикла - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь вложить один цикл в другой, вырваться из внутреннего цикла и перейти к внешнему циклу при выполнении условия. Мои фреймы данных a_2011 и 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))
{
  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. Но приведенный выше код не пропускает команды после оператора break во внутреннем цикле.

Буду признателен за любую помощь в выяснении, что здесь не так.

Ответы [ 3 ]

5 голосов
/ 09 декабря 2011

Проблема заключается в том, что внутренний цикл прерывается только в случае совпадения строки first 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]])
4 голосов
/ 09 декабря 2011

Вам не нужен цикл вообще.Вот для чего ifelse.

a_2011$City <- ifelse( a_2011[,1] %in% TRS[,1], 1, 0)
4 голосов
/ 09 декабря 2011

Вам не нужен цикл для достижения этой цели в 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
...