Понимание сообщения об исключении

#r

#r

Вопрос:

У меня есть фрейм данных All_companies , и я сравниваю COMPANY_NUMBER в столбце 1 со следующим элементом в том же столбце

 COMPANY_NUMBER      COMPANY_NAME
444444               ABC
444444               ABC
555555               XYZ
555555               XYZ
  

Код

 for (i in 1:(nrow(All_companies)-1)) {
  if(All_companies[i, 1] == All_companies[i   1, 1])
  {
    print("Match")
  } 
  else if (All_companies[i, 1] != All_companies[i   1, 1])
  {
    print("No Match") 
  }
}
  

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

Ошибка в if (All_companies[i, 1] == All_companies[i 1, 1]) { : отсутствует значение, где требуется TRUE / FALSE

Есть мысли о том, как я могу с этим справиться? Заранее большое спасибо.

Комментарии:

1. Есть ли у вас NA ‘s в данных?

Ответ №1:

Извините, я не понимаю этот синтаксис, но разве основной цикл не должен быть for (i in 1:(nrow(All_companies)-2)) { ?

Комментарии:

1. с (i в 1:(nrow(All_companies) -2)) он по-прежнему выдает точно такую же ошибку

Ответ №2:

Если сравнение внутри if инструкции является NA, то оно завершается с ошибкой:

 if (NA) {
    print("Match")
}
#> Error in if (NA) print("Match") : missing value where TRUE/FALSE needed
  

Итак, у вас, вероятно, есть некоторые NA ‘s в вашем All_companies наборе данных, потому что сравнение чего-либо с NA есть NA .

С NA выдает ошибку:

 All_companies <- read.table(header = T, text = "
COMPANY_NUMBER      COMPANY_NAME
444444               ABC
444444               ABC
555555               XYZ
555555               XYZ
NA                   ABC
")

for (i in 1:(nrow(All_companies)-1)) {
  if (All_companies[i, 1] == All_companies[i   1, 1])
  {
    print("Match")
  }
  else if (All_companies[i, 1] != All_companies[i   1, 1])
  {
    print("No Match") 
  }
}
#> [1] "Match"
#> [1] "No Match"
#> [1] "Match"
#> Error in if (All_companies[i, 1] == All_companies[i   1, 1]) {: missing value where TRUE/FALSE needed
  

Без NA он запускается:

 All_companies <- read.table(header = T, text = "
COMPANY_NUMBER      COMPANY_NAME
444444               ABC
444444               ABC
555555               XYZ
555555               XYZ
")

for (i in 1:(nrow(All_companies)-1)) {
  if (All_companies[i, 1] == All_companies[i   1, 1])
  {
    print("Match")
  }
  else if (All_companies[i, 1] != All_companies[i   1, 1])
  {
    print("No Match") 
  }
}
#> [1] "Match"
#> [1] "No Match"
#> [1] "Match"
  

Создано 2020-08-13 пакетом reprex (версия 0.3.0)

Комментарии:

1. Пропущенных значений нет, однако не все COMPANY_NUMBERS являются числовыми числами, некоторые из них являются буквенно-цифровыми, например 333333A

2. Привет @Ahson, буквенно-цифровые значения не должны иметь значения… должна быть еще одна иголка в стоге сена. Пожалуйста, проверьте выходные данные summary(All_companies) , если есть какие-либо NA, NaN, NULL или что-то неожиданное. Дело в том, что ваш код, похоже, в порядке, просто есть какая-то проблема со столбцом данных.

Ответ №3:

Да, действительно, отсутствовали значения. Однако, даже с отсутствующим значением, когда я добавил isTRUE в код, он выполнялся без сообщения об ошибке.

 if(isTRUE(All_companies[i, 1] == All_companies[i   1, 1]))