Вопрос по replace, r, variable-assignment, rename, dataframe – как заменить числовые коды метками значений из справочной таблицы?

9

Этот вопрос связан сэтот вопрос, но не совсем то же самое.

Скажи, у меня есть этот фрейм данных,

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

и строка с удобочитаемой информацией о кодах профессии. Сказать,

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

Теперь я ищу самый простой способ заменить значения вdf$profession с текстом, найденным вprofession.code, Желательно без использования специальных библиотек, если только это не значительно сокращает код.

Я хотел бы, чтобы мой конечный результат был

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

Любая помощь будет принята с благодарностью.

Спасибо, Эрик

Ваш Ответ

3   ответа
3

Я играл с ним, и это мое текущее решение, используя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 

Еще интересно, есть ли у кого-то другие предложения по решению проблемы. Я бы предпочел сделать это, используя только базовую функцию в R.

10

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

Обратите внимание, что я должен был добавить0 запись в вашемprofession.code вектор для учета этих нулей.

РЕДАКТИРОВАТЬ: здесь представлено обновленное решение для учета нижеприведенного комментария Эрика о том, что данные могут содержать любое количество кодов профессий, для которых нет соответствующих описаний:

match.idx <- match(df$profession, profession.code)
df$profession.str <- ifelse(is.na(match.idx),
                            df$profession,
                            names(profession.code)[match.idx])
Спасибо за предоставленное решение. Моя проблема в том, что данные передаются мне из базы данных, и иногда отправляются неожиданные номераback to meТаким образом, я мог получить любое число, не только 0. Я должен объяснить это каким-то образом. Eric Fail
Это не проблема, я предоставлю обновление.
1

arules пакет решает эту проблему, используяdecode функция. Из документации:

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)

Преимущество в том, что пакет также предлагает функцииencode а такжеrecode, Я считаю, что их цель проста.

Похожие вопросы