A parte i suggerimenti nei commenti si potrebbe anche usare match
nel seguente modo.
Crea dati di esempio:
set.seed(1)
vals_in <- c("x", "y", "z") # unique values in your input vector
vec_in <- sample(vals_in, 10, replace = TRUE) # sample from vals_in to create input
vals_out <- c("x1", "x2", "x3") # values to replace
Ora, per sostituire la nidificato ifelse
s si potrebbe fare:
vec_out <- vals_out[match(vec_in, vals_in)]
Il risultato è
vec_out
# [1] "x1" "x2" "x2" "x3" "x1" "x3" "x3" "x2" "x2" "x1"
Un po 'di confronto di due approcci:
set.seed(1)
vals_in <- letters
vec_in <- sample(vals_in, 1e7, replace = TRUE)
vals_out <- LETTERS
system.time(vals_out[match(vec_in, vals_in)])
User System verstrichen
0.378 0.020 0.398
system.time(unname(setNames(vals_out, vals_in)[vec_in]))
User System verstrichen
1.020 0.062 1.084
fonte
2016-02-11 10:31:38
Utilizzare un vettore o un elenco con nome oppure osservare 'switch' o' factor'. – A5C1D2H2I1M1N2O1R2T1
Trovo più catene ifelse più leggibili Se non indentate ogni nuovo ifelse ma aggiungete un'interruzione di riga prima di ', NA)))'. – Pekka
Consiglierei l'uso di tabelle per qualsiasi cosa tranne le istruzioni 'ifelse' più semplici. Semplifica il debug e la comprensione in futuro. – Hugh