作为R中data.table包的相对缺乏经验的用户,我一直在尝试将一个文本列处理成大量的指示符列(虚拟变量),每列中有一个1表示特定的子字符串是在字符串列中找到.例如,我想处理这个:
ID String
1 a$b
2 b$c
3 c
Run Code Online (Sandbox Code Playgroud)
进入这个:
ID String a b c
1 a$b 1 1 0
2 b$c 0 1 1
3 c 0 0 1
Run Code Online (Sandbox Code Playgroud)
我已经弄清楚如何进行处理,但运行时间比我想要的要长,我怀疑我的代码效率低下.我的代码的可重现版本与虚拟数据如下.请注意,在实际数据中,要搜索的子字符串超过2000个,每个子字符串的长度大约为30个字符,最多可能有几百万行.如果需要,我可以并行化并为问题投入大量资源,但我希望尽可能优化代码.我试过运行Rprof,这表明没有明显(对我而言)改进.
set.seed(10)
elements_list <- c(outer(letters, letters, FUN = paste, sep = ""))
random_string <- function(min_length, max_length, separator) {
selection <- paste(sample(elements_list, ceiling(runif(1, min_length, max_length))), collapse = separator)
return(selection)
}
dt <- data.table(id = c(1:1000), messy_string = "")
dt[ , messy_string := random_string(2, 5, "$"), by = id]
create_indicators <- function(search_list, …Run Code Online (Sandbox Code Playgroud)