9

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

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

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

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"))

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

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

  • Спасибо за предоставленное решение. Моя проблема в том, что данные передаются мне из базы данных, и иногда отправляются неожиданные номераback to meТаким образом, я мог получить любое число, не только 0. Я должен объяснить это каким-то образом.

    от Eric Fail
  • Это не проблема, я предоставлю обновление.

    от
  • 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.

  • 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, Я считаю, что их цель проста.

  • 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])