2012-08-03 8 views
10

Dies ist eine reine Neugier (Lernen Sie mehr über Reduce). Es gibt viel bessere Methoden, um das zu erreichen, was ich mache, und ich bin nicht an ihnen interessiert.mit Reduce/do.call mit ifelse

Einige Leute verwenden eine Reihe verschachtelter ifelse Befehle, um etwas zu rekodieren/nachzuschlagen. Vielleicht sieht es wie folgt aus:

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)))) 

Gibt es eine Möglichkeit, entweder do.call oder Reduce mit dem ifelse zu verwenden, um ein wenig mehr eloquent den Job zu erledigen?

+3

Große Frage. Natürlich ist in der Praxis etwas wie 'sapply (x, Funktion (x) Schalter (x, a = 1, b = 2, c = 3, d = 4, 5 ') wahrscheinlich am saubersten. –

+0

@Richie Danke. d nähert sich dies tatsächlich mit einer Nachschlagetabelle unter Verwendung von Umgebungen oder einer Standardindizierung mit 'match' an, aber ich wollte sehen, ob' Reduce' oder 'do.call' auf dieses Problem angewendet werden könnte. –

+0

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

Antwort

3

Versuchen Sie folgendes:

> 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

Ich sehe kein 'ifelse' und eine 'do.call'- oder' Reduce'-Funktion überall :) –

+5

Probieren Sie 'do.call <- strapply' aus und wiederholen Sie das obige mit' do.call' anstelle von ' strappy. –

+0

Das funktioniert in der Tat :) –

0

Hier ist ein Versuch. Es ist weder schön noch verwendet es 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) 
Verwandte Themen