Nota esta respuesta comenzó como un intento de resolver el problema mucho más simple publicado en How to replace all values in data frame with a vector of values?. Lamentablemente, esta pregunta se cerró como duplicado de la pregunta real. Entonces, intentaré sugerir una solución basada en reemplazar los niveles de factor para ambos casos, aquí.
En caso de que sólo es un vector (o columna marco de uno de datos) cuyos valores necesitan ser reemplazados y no hay objeciones para el uso de factores podemos coaccionar el vector de factor y cambiar los niveles de los factores según sea necesario:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
x <- factor(x)
x
#[1] 1 1 4 4 5 5 1 1 2
#Levels: 1 2 4 5
replacement_vec <- c("A", "T", "C", "G")
levels(x) <- replacement_vec
x
#[1] A A C C G G A A T
#Levels: A T C G
Usando el paquete forcats
esto se puede hacer en una sola línea:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
forcats::lvls_revalue(factor(x), replacement_vec)
#[1] A A C C G G A A T
#Levels: A T C G
En el caso todos los valores de varias columnas de un marco de datos necesitan ser reemplazados, el enfoque se puede ampliar.
foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"),
snp2 = c("AA", "AT", "AG", "AA"),
snp3 = c(NA, "GG", "GG", "GC"),
stringsAsFactors=FALSE)
level_vec <- c("AA", "AC", "AG", "AT", "GC", "GG")
replacement_vec <- c("0101", "0102", "0103", "0104", "0302", "0303")
foo[] <- lapply(foo, function(x) forcats::lvls_revalue(factor(x, levels = level_vec),
replacement_vec))
foo
# snp1 snp2 snp3
#1 0101 0101 <NA>
#2 0103 0104 0303
#3 0101 0103 0303
#4 0101 0101 0302
Tenga en cuenta que level_vec
replacement_vec
y debe tener la misma longitud.
Más importante aún, level_vec
debe ser completo, es decir, incluir todos los valores posibles en las columnas afectadas del marco de datos original. (Use unique(sort(unlist(foo)))
para verificar). De lo contrario, cualquier valor faltante se forzará al <NA>
. Tenga en cuenta que esto también es un requisito para Martin Morgans's answer.
Por lo tanto, si solo hay unos pocos valores diferentes que reemplazar, probablemente estará mejor con una de las otras respuestas, por ejemplo, Ramnath's.
¿Es su diccionario una lista R? – Mark
Actualmente no, pero sería fácil convertirlo en uno. – Stedy
Quizás estas preguntas podrían ser útiles: [Case Statement Equivalent] (http://stackoverflow.com/q/4622060/168747), [Cómo agregar una columna en un 'data.frame'] (http: // stackoverflow. com/q/4562547/168747), [Limpieza de datos en hojas de Excel] (http://stackoverflow.com/q/7374314/168747). – Marek