我有以下代码,如果这是最好的方法或更快的方法,需要您的帮助。 目前我花了20多分钟才完成它。
library(dplyr)
email_address=c('abc@gmail.com', 'pqr@gmail.com','xyz@gmail.com')
working_df<-as.data.frame(email_address, stringsAsFactors =F )
# 40K rows
master_email_address=c('abc@gmail.com', 'pqr@gmail.com','xyz@gmail.com','abc@gmail.com.au', 'team-pqr@gmail.com','cnn_xyz@gmail.com')
master_df<-as.data.frame(master_email_address, stringsAsFactors =F)
# 90K rows
get_string2<- function(in_col_value){
temp_str<-NA
temp_str<-paste(grep(in_col_value, master_df$master_email_address, value=T), collapse = ",")
return(temp_str)
}
working_df %>%
rowwise() %>%
mutate(fuzzy_domain=as.character(get_string2(email_address)))
working_df:保留几个电子邮件地址。 master_df:包含所有可能的电子邮件地址,其中一些包含前缀,后缀等
我想检查 working_df 中的email_address(如果它们在 master_df 中以某种格式/格式存在),并返回带有这些可能值的逗号分隔字符串。 我尝试使用apply和它几乎相同的性能相同的循环。
谢谢!
答案 0 :(得分:0)
您可以使用以下内容简单地(快4倍)加快速度:
apply(working_df, 1, get_string2)
microbenchmark
对我的MacBook Air进行测试,times=1000L
的平均值约为185μs;另一种方法为times=1000L
产生了大约742μs的平均值。
此外,您可以删除temp_str <- NA
,因为它不需要。无论何时找不到匹配项,您都将返回一个空字符串。