2012-04-03 12 views
8

Esta pregunta está relacionada con this question, pero no es lo mismo.¿cómo reemplazo los códigos numéricos con las etiquetas de valor de una tabla de búsqueda?

Decir que tengo esta trama de datos,

df <- data.frame(
       id = c(1:6), 
       profession = c(1, 5, 4, NA, 0, 5)) 

y una cadena con información legible por humanos acerca de los códigos de la profesión. Decir,

profession.code <- c(
        Optometrists=1, Accountants=2, Veterinarians=3, 
        `Financial analysts`=4, Nurses=5) 

Ahora, estoy buscando la manera más fácil de reemplazar los valores en df$profession con el texto que se encuentra en profession.code. Preferiblemente sin el uso de bibliotecas especiales, a menos que acorte el código significativamente.

Me gustaría que mi resultado final sea

df <- data.frame(
       id = c(1:6), 
       profession = c("Optometrists", "Nurses", 
       "Financial analysts", NA, 0, "Nurses")) 

Cualquier ayuda sería muy apreciada.

Gracias, Eric

Respuesta

10

Usted puede hacerlo de esta manera:

df <- data.frame(id = c(1:6), 
       profession = c(1, 5, 4, NA, 0, 5)) 

profession.code <- c(`0` = 0, Optometrists=1, Accountants=2, Veterinarians=3, 
        `Financial analysts`=4, Nurses=5) 

df$profession.str <- names(profession.code)[match(df$profession, profession.code)] 
df 
# id profession  profession.str 
# 1 1   1  Optometrists 
# 2 2   5    Nurses 
# 3 3   4 Financial analysts 
# 4 4   NA    <NA> 
# 5 5   0     0 
# 6 6   5    Nurses 

Tenga en cuenta que he tenido que añadir una entrada en su 0profession.code vector de dar cuenta de esos ceros.

EDIT: aquí es una solución actualizada para tener en cuenta el comentario de Eric a continuación que los datos pueden contener cualquier número de códigos profesión para la que no existen descripciones correspondientes:

match.idx <- match(df$profession, profession.code) 
df$profession.str <- ifelse(is.na(match.idx), 
          df$profession, 
          names(profession.code)[match.idx]) 
+0

Gracias por proporcionar una solución. Mi problema es que los datos me pasan de una base de datos y, a veces, se me envían números inesperados _ para que yo pueda obtener cualquier número, no solo 0. Tengo que dar cuenta de eso de alguna manera. –

+0

Eso no es un problema, proporcionaré una actualización. – flodel

3

Jugué un rato con él y esto es mi solución actual usando el paquete car.

pLoop <- function(v) paste(profession.code[v],"='", names(profession.code[v]),"';") 
library(car) 
df$profession<- recode(df$profession, paste(sapply(1:5, pLoop),collapse="")) 

df 
# id   profession 
# 1   Optometrists 
# 2    Nurses 
# 3 Financial analysts 
# 4     <NA> 
# 5     0 
# 6    Nurses 

Sigue interesado si alguien tiene otras sugerencias para una solución. Preferiría hacerlo utilizando solo la función base en R.

1

Personalmente, me gusta la forma en que el paquete arules trata este problema, utilizando la función decode. A partir de la documentación:

library(arules) 
data("Adult") 

## Example 1: Manual decoding 
## get code 
iLabels <- itemLabels(Adult) 
head(iLabels) 

## get undecoded list and decode in a second step 
list <- LIST(Adult[1:5], decode = FALSE) 
list 

decode(list, itemLabels = iLabels) 

ventaja es que el paquete también ofrece las funciones encode y recode. Su propósito respectivo es directo, creo.

Cuestiones relacionadas