这个问题是涉及到这个问题 ,但并不完全一样。
说我有这个数据帧,
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"))
任何帮助将不胜感激。
谢谢,埃里克
你可以这样来做:
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])
我打得四处它,这是一个使用我目前的解决方案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.它做的事
我个人比较喜欢的方式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
。 他们各自的目的很简单,我相信。