Mientras R ifelse
es increíblemente útil, tiene un defecto en particular: en la llamada ifelse(test, yes, no)
se evalúan todos los elementos de yes
y no
, incluso aquellos que se desecha.Buscando un ifelse más eficiente()
Esto es más bien un desperdicio si se está usando en el medio de un ejercicio numérico complicado, dicen en una función que se alimenta a integrate
, uniroot
, optim
o lo que sea. Por ejemplo, uno podría haber
ifelse(test, f(x, y, z), g(a, b, c))
donde f
y g
son arbitrariamente funciones complejas o lentos, posiblemente con la participación más anidados ifelse
's.
¿Alguien ha escrito un reemplazo para ifelse
que solo evalúa los elementos de yes
/no
que se conservarán? Básicamente, algo en la línea de
out <- test
for(i in seq_along(out))
{
if(test[i]) out[i] <- f(x[i], y[i], z[i])
else out[i] <- g(a[i], b[i], c[i])
}
pero sin la torpeza/ineficacia de un bucle explícito. ¿Esto es posible incluso sin entrar en las entrañas de R?
Supongo que * podría * usar el bucle explícito, pero luego creo que seguiré el viejo dicho de que un programador determinado puede escribir Fortran en cualquier idioma ... –
¿qué le parece usar apply? entonces el ifelse() se evalúa para cada elemento, y del mismo modo el 'sí' y 'no solo se evalúan para los elementos relevantes, a menos que mi comprensión de la aplicación sea incorrecta, pero estoy seguro de que me funcionó en el pasado – nzcoops
I intenté usar 'mapply' con if() - else, y eso fue 10 veces más lento que el vectorizado' ifelse'! –