data.frame对列进行逐行计算

时间:2018-04-18 22:00:41

标签: r

我有以下代码,如果这是最好的方法或更快的方法,需要您的帮助。 目前我花了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和它几乎相同的性能相同的循环。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容简单地(快4倍)加快速度:

apply(working_df, 1, get_string2)

microbenchmark对我的MacBook Air进行测试,times=1000L的平均值约为185μs;另一种方法为times=1000L产生了大约742μs的平均值。

此外,您可以删除temp_str <- NA,因为它不需要。无论何时找不到匹配项,您都将返回一个空字符串。