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$professionprofession.code. 最好不使用特殊库,除非它显着缩短代码。

我希望我的最终结果是

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

任何帮助将不胜感激。

谢谢,埃里克

4

3 回答 3

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])
于 2012-04-03T23:02:31.957 回答
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 中的基本函数来做到这一点。

于 2012-04-04T01:25:26.257 回答
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. 我相信他们各自的目的很简单。

于 2014-02-19T11:36:30.977 回答