2012-04-03 9 views
8

Questa domanda è relativa a this question, ma non esattamente la stessa.come sostituire i codici numerici con le etichette dei valori da una tabella di ricerca?

Dire che ho questa cornice di dati,

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

e una stringa con informazioni leggibile sui codici professione. Dire,

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

ora, sto cercando il modo più semplice per sostituire i valori in df$profession con il testo trovato in profession.code. Preferibilmente senza l'uso di librerie speciali, a meno che non riduca significativamente il codice.

Vorrei che il mio risultato finale di essere

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

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie, Eric

risposta

10

Si può fare in questo modo:

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 

Nota che ho dovuto aggiungere una voce 0 nel profession.code vettore per tenere conto di quelle zeri.

EDIT: qui è una soluzione aggiornata per tenere conto di commento di Eric seguito che i dati possono contenere qualsiasi numero di codici di professione per la quale non ci sono descrizioni corrispondenti:

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

Grazie per aver fornito una soluzione. Il mio problema è che i dati mi vengono trasmessi da un database, ea volte i numeri inaspettati vengono inviati _back a me_, quindi potrei ottenere qualsiasi numero, non solo 0. Devo spiegarlo in qualche modo. –

+0

Questo non è un problema, fornirò un aggiornamento. – flodel

3

ho giocato intorno con esso e questo è la mia attuale soluzione utilizzando il pacchetto 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 

Ancora interesse se qualcuno ha altri suggerimenti per una soluzione. Preferirei farlo usando solo la funzione base in R.

1

Personalmente mi piace il modo in cui il pacchetto arules si occupa di questo problema, utilizzando la funzione decode. Dalla documentazione:

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) 

vantaggio è che il pacchetto offre anche le funzioni encode e recode. Il loro rispettivo scopo è semplice, credo.

Problemi correlati