Простой цикл if-else в R

может кто-нибудь сказать мне, что не так с этим циклом if-else в R? Я часто не могу заставить циклы if-else работать. Я получаю сообщение об ошибке:

if(match('SubjResponse',names(data))==NA) {
    observed <- data$SubjResponse1
}
else {
    observed <- data$SubjResponse
}

отметим, что data - это фрейм данных.

ошибка

Error in if (match("SubjResponse", names(data)) == NA) { : 
  missing value where TRUE/FALSE needed

2 ответов


как отметил @DirkEddelbuettel, вы не можете проверить NA этак. Но вы можете сделать match не возвращать NA:

С помощью nomatch=0 и повернув на if предложение (так как 0 трактуется как FALSE), код можно упростить. Кроме того, еще одна полезная идиома кодирования-назначить результат предложения if, таким образом, вы не будете вводить имя переменной в одну из ветвей...

поэтому я бы написал это так:

observed <- if(match('SubjResponse',names(data), nomatch=0)) {
    data$SubjResponse # match found
} else {
    data$SubjResponse1 # no match found
}

по способ, если у вас "часто" возникают проблемы с if-else, вы должны знать две вещи:

  1. объект для тестирования не должен содержать NA или NaN, или быть строкой (символом режима) или каким-либо другим типом, который нельзя принудить к логическому значению. Числовое значение в порядке: 0 -FALSE все остальное (кроме NA/NaN) - это TRUE.

  2. длина объекта должна быть ровно 1 (скалярная величина). Это можете быть больше, но тогда вы получите предупреждающий. Если он короче, вы получаете ошибку.

примеры:

len3 <- 1:3
if(len3) 'foo'  # WARNING: the condition has length > 1 and only the first element will be used

len0 <- numeric(0)
if(len0) 'foo'  # ERROR: argument is of length zero

badVec1 <- NA
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed

badVec2 <- 'Hello'
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical

это не полный пример, поскольку у нас нет данных, но я вижу эти проблемы:

  1. вы не может