这是这个问题的后续问题,最初是受到这个问题的启发,但并不完全相同。
这是我的情况。首先我从数据库中提取一些数据,
df <- data.frame(id = c(1:6),
profession = c(1, 5, 4, NA, 0, 5))
df
# id profession
# 1 1
# 2 5
# 3 4
# 4 NA
# 5 0
# 6 5
其次,我提取了一个包含有关职业代码的人类可读信息的键表,
profession.codes <- data.frame(profession.code = c(1,2,3,4,5),
profession.label = c('Optometrists',
'Accountants', 'Veterinarians',
'Financial analysts', 'Nurses'))
profession.codes
# profession.code profession.label
# 1 Optometrists
# 2 Accountants
# 3 Veterinarians
# 4 Financial analysts
# 5 Nurses
现在,我想用来自的标签覆盖我的变量,profession
最好使用包中的标签,但我愿意接受任何智能解决方案。虽然我确实喜欢那层保留 x 的顺序。df
profession.codes
join
plyr
我目前是这样做的,
# install.packages('plyr', dependencies = TRUE)
library(plyr)
profession.codes$profession <- profession.codes$profession.code
df <- join(df, profession.codes, by="profession")
# levels(df$profession.label)
df$profession.label <- factor(df$profession.label,
levels = c(levels(df$profession.label),
setdiff(df$profession, df$profession.code)))
# levels(df$profession.label)
df$profession.label[df$profession==0 ] <- 0
df$profession.code <- NULL
df$profession <- NULL
names(df) <- c("id", "profession")
df
# id profession
# 1 Optometrists
# 2 Nurses
# 3 Financial analysts
# 4 <NA>
# 5 0
# 6 Nurses
这就是我profession
在不丢失NA
和 的情况下覆盖的方式0
。
问题是 0 可能是 17 或任何数字,我想以某种方式解释这一点。此外,如果可能的话,我还想缩短我的代码。
任何帮助将不胜感激。
谢谢,埃里克