此问题与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"))
非常感谢任何帮助。
谢谢, 埃里克
答案 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)
优点是该软件包还提供了encode
和recode
功能。我相信他们各自的目的是直截了当的。