如果您确实有一个庞大的数据集,那么这个可能是比较好的方法,虽然需要输入一些内容。Bryangoodrich和Dason在talkstats.com教给了我这个方法。它使用哈希表或创建包含查找表的环境。我实际上会将此函数(哈希函数)保留在我的.Rprofile文件中,用于字典查找。
我复制了您的数据1000次,使其变得更大一些。
hash <- function(x, type = "character") {
e <- new.env(hash = TRUE, size = nrow(x), parent = emptyenv())
char <- function(col) assign(col[1], as.character(col[2]), envir = e)
num <- function(col) assign(col[1], as.numeric(col[2]), envir = e)
FUN <- if(type=="character") char else num
apply(x, 1, FUN)
return(e)
}
dat <- dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA,
-20L), class = "data.frame")
dat <- dat[rep(seq_len(nrow(dat)), 1000), , drop=FALSE]
rownames(dat) <-NULL
dat
med.lookup <- data.frame(val=as.character(1:12),
med=rep(c('Tylenol', 'Advil', 'Bayer', 'Generic'), each=3))
meds <- hash(med.lookup)
recoder <- function(x){
x <- as.character(x)
rc <- function(x){
if(exists(x, env = meds))get(x, e = meds) else NA
}
sapply(x, rc, USE.NAMES = FALSE)
}
recoder(dat[, 1])
在这种情况下,哈希速度较慢,但如果您需要更多的重新编码级别,则速度会超过其他方法。