2012-01-18 11 views
8

Puede alguien decirme lo que está mal con este if-else bucle en R? Frecuentemente no puedo hacer que los bucles if-else funcionen. Me aparece un error:simple if-else bucle en I

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

Tenga en cuenta que data es una trama de datos.

El error es

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

Respuesta

2

Como se señaló @DirkEddelbuettel, no se puede probar NA de esa manera. Pero se puede hacer match no vuelve NA:

Mediante el uso de nomatch=0 y revertir la cláusula if (ya que se trata como 0FALSE), el código se puede simplificar. Por otra parte, otro lenguaje de codificación de utilidad es asignar el resultado de la cláusula if, de esa manera no se escribe mal el nombre de variable en una de las ramas ...

Así que me gustaría escribir así:

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

Por cierto si usted "con frecuencia" tiene problemas con if-else, se debe tener en cuenta dos cosas:

  1. el objeto de prueba no debe contener NA o NaN, o ser una cadena (carácter de modo) o algún otro tipo que no se puede forzar en un valor lógico. Numérica está bien: 0 es FALSE cualquier otra cosa (pero NA/NaN) es TRUE.

  2. La longitud del objeto debe ser exactamente 1 (un valor escalar). Se puede ser más largo, pero entonces se obtiene una advertencia. Si es más corto, obtienes un error.

Ejemplos:

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 
7

Esto no es un ejemplo completo, ya que no disponemos de los datos pero no veo estos temas:

  1. You no puede prueba para NA con ==, se necesita is.na()
  2. Del mismo modo, la salida de match() y amigos generalmente se prueba para NULL o length()==0
  3. tiendo a escribir } else { en una línea.
+0

'match' será * siempre * devolver un vector de la misma longitud que el primer argumento (' x'). Entonces, en este caso, siempre un valor escalar. – Tommy

+0

Circule 8.1.4 de 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –