这是问题的代码:
set.seed(1234)
y <- 1e7
renamer <- function(text){
text[grep("ac", text)] <- "aaa"
text[grep("gf", text)] <- "bbb"
text[grep("er", text)] <- "ccc"
text[grep("hy", text)] <- "ddd"
text[grep("nh", text)] <- "eee"
text[grep("oi", text)] <- "fff"
text[grep("nu", text)] <- "ggg"
text[grep("vf", text)] <- "hhh"
text[grep("cd", text)] <- "iii"
text[grep("po", text)] <- "jjj"
return(text)
}
smp <- NULL
for(i in 1:100){
smp <- c(smp, paste0(sample(letters, 15, T), collapse= ""))
}
df <- data.table(a = sample(smp, y, T))
# > system.time(renamer(text = df$a))
# user system elapsed
# 15.54 0.08 15.70
问题:有一个大型数据集,需要以省时的方式替换大部分值。我的代码可以解决问题。但是,我确实可以使用更快的解决方案。
请注意,存在重复出现的值。而且......(有时会发生)当我写这个问题时,我可能想出了解决方案,其中包括将列转换为因子并替换级别值。但无论如何我决定留下这个问题,因为其他人可能需要帮助解决这个问题,或者有一些聪明的替代解决方案。
这是基准的因子解决方案:
# > system.time({
# + df$a <- factor(df$a)
# + levels(df$a) <- renamer(levels(df$a))
# + df$a <- as.character(df$a)
# + })
# user system elapsed
# 1.25 0.14 1.42
最佳答案
我建议创建一个简单的查找表并使用优秀的stringi::stri_detect_fixed
函数(给我〜X100加速)
library(data.table)
library(stringi)
Lookup <- c("ac", "gf", "er", "hy", "nh", "oi", "nu", "vf", "cd", "po")
Rename <- substring(paste(rep(letters[1:10], each = 3), collapse = ""),
seq(1, 30 ,3), seq(3, 30, 3))
system.time(setDT(df)[, Result := Rename[stri_detect_fixed(a, Lookup)], by = a])
# user system elapsed
# 0.10 0.05 0.14
关于R:替换数据框(表)中字符串的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35410428/