es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Traduciendo Stata a R y teniendo problemas con is.na.

Estoy traduciendo código de Stata a código de R, pero ahora tengo algunos problemas de novato como este.

Este es mi código de Stata:

gen aposentadofam=1 if proprendaposent > 0 & proprendaposent ~=.;
replace aposentadofam=0 if proprendaposent == 0 | proprendaposent ==.;

Y esto es lo que intenté hacer en R:

# pemg <- mutate(pemg, aposentadofam = NA_real_)
# pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent >0 & !is.na(proprendaposent) ~ 1, TRUE ~ aposentadofam))
# pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent==0 | is.na(proprendaposent) ~ 0, TRUE ~ aposentadofam))

La línea con is.na() parece estar funcionando correctamente, pero la que tiene !is.na() no. Me da este mensaje de error:

LHS of case 1 (`proprendaposent > 0 & !is.na(proprendaposent) ~ 1`) must be a logical vector, not a `formula` object.

¿Qué debo hacer?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código R es que la función case_when() espera un vector lógico como el lado izquierdo de cada caso, pero la expresión proprendaposent > 0 & !is.na(proprendaposent) es un objeto formula.

    Para solucionar esto, puede usar la función if_else(), que toma una condición lógica como primer argumento y evalúa a un valor si la condición es “VERDADERA” y otro valor si es “FALSO”. Así es como podría traducir el código Stata a R usando if_else():

    pemg <- mutate(pemg, aposentadofam = if_else(proprendaposent > 0 & !is.na(proprendaposent), 1, 
                                                  if_else(proprendaposent == 0 | is.na(proprendaposent), 0, NA_real_)))
    

    Este código establece la variable aposentadofam en 1 si proprendaposent es mayor que 0 y no está perdido (!is.na()), 0 si es igual a 0 o está perdido (is.na()), y NA de lo contrario.

Comments are closed.