如何使用查找表中的值标签替换数字代码?

时间:2012-04-03 22:45:58

标签: r replace variable-assignment dataframe rename

此问题与this question有关,但不完全相同。

说我有这个数据框,

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 个答案:

答案 0 :(得分: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条目以说明这些零。

编辑:这是一个更新的解决方案,以便在下面记下Eric的评论,数据可能包含任何数量的专业代码,但没有相应的描述:

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

答案 1 :(得分: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中的基本函数。

答案 2 :(得分: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)

优点是该软件包还提供了encoderecode功能。我相信他们各自的目的是直截了当的。