2012-08-03 29 views
10

Esto es puramente una curiosidad (aprender más acerca de Reducir). Hay métodos mucho mejores para lograr lo que estoy haciendo y no estoy interesado en ellos.usando Reduce/do.call con ifelse

Algunas personas usan una serie de comandos anidados ifelse para recodificar/buscar algo. Tal vez el aspecto siguiente:

set.seed(10); x <- sample(letters[1:10], 300, T) 
ifelse(x=="a", 1, 
    ifelse(x=="b", 2, 
    ifelse(x=="c", 3, 
    ifelse(x=="d", 4, 5)))) 

¿Hay una manera de utilizar ya sea do.call o Reduce con el ifelse a hacer el trabajo un poco más elocuente?

+3

Una gran pregunta. Por supuesto, en la práctica, algo como 'sapply (x, función (x) switch (x, a = 1, b = 2, c = 3, d = 4, 5' es probablemente el más limpio. –

+0

@Richie Gracias. I ' De hecho, me acerco a esto con una tabla de búsqueda usando entornos o indexación estándar con 'coincidencia', pero quería ver si' Reduce' o 'do.call' podrían aplicarse a este problema. –

+0

Como en:' match (x, letters) [1: 4], nomatch = 5) ' –

Respuesta

3

Prueba esto:

> library(gsubfn) 
> strapply(x, ".", list(a = 1, b = 2, c = 3, d = 4, 5), simplify = TRUE) 
    [1] 5 4 5 5 1 3 3 3 5 5 5 5 2 5 4 5 1 3 4 5 5 5 5 4 5 5 5 3 5 4 5 1 2 5 5 5 5 
[38] 5 5 5 3 3 1 5 3 2 1 5 2 5 4 5 3 5 2 5 5 5 4 5 1 2 5 4 5 5 5 5 1 3 1 5 5 5 
[75] 1 5 4 5 3 3 5 5 3 5 3 1 5 3 2 2 5 5 5 5 4 5 3 5 5 1 4 1 4 5 5 5 5 5 5 5 5 
[112] 5 2 5 5 5 3 5 5 5 2 4 4 5 3 3 5 4 5 5 5 1 5 3 4 3 5 5 2 5 5 3 1 5 2 5 5 5 
[149] 1 5 5 2 1 2 4 2 2 3 5 2 5 5 5 5 5 3 5 5 5 5 5 5 5 5 5 5 2 3 5 4 4 2 5 5 5 
[186] 5 5 5 5 2 1 1 1 5 5 5 5 3 5 5 3 5 5 5 2 5 5 5 3 5 5 5 5 5 1 5 5 5 5 2 2 5 
[223] 5 5 4 3 4 5 5 4 5 5 5 3 5 3 5 5 5 5 4 5 5 1 5 5 2 5 5 5 2 5 5 3 2 5 4 5 2 
[260] 5 5 3 5 5 1 4 3 5 4 5 2 5 5 3 5 5 5 5 5 1 1 5 2 5 1 5 5 5 5 5 5 5 5 5 5 5 
[297] 5 1 5 2 
+1

No veo un' ifelse' y una función 'do.call' o' Reduce' en cualquier lugar :) –

+5

Pruebe 'do.call <- strapply' y luego repita lo anterior con' do.call' en lugar de ' strapply'. –

+0

Eso sí funciona :) –

0

Aquí es un intento. No es hermoso ni usa ifelse:

f <- function(w,s) { 
    if(is.null(s$old)) 
    w$output[is.na(w$output)] <- s$new 
    else 
    w$output[w$input==s$old] <- s$new 
    return(w) 
} 

set.seed(10); x <- sample(letters[1:10], 300, T) 

subst <- list(
    list(old="a", new=1), 
    list(old="b", new=2), 
    list(old="c", new=3), 
    list(old="d", new=4), 
    list(old=NULL, new=5) 
) 
workplace <- list(
    input=x, 
    output=rep(NA, length(x)) 
) 

Reduce(f, subst, workplace)