字串匹配

Word String matching

我有一个包含两列人名的数据框。使用以下代码生成 table:

names.1=c('Ron ven goh','Phil Mick' , 'Rohan Aggarwal','John Deo Lin')
names.2=c('Rob ven goh','kitty Mol','Tejas Aggarwal','Jorge Mol Lin')
df=data.table(names.1,names.2)

我的任务是添加另一个二进制变量(是,否)-如果第 1 列整个字符串中的任何单词与第 2 列整个字符串中的任何单词匹配,则 "Yes",否则 "No" - 只要找到匹配项,它就会给出“是”。

我有以下代码:

for(i in 1:nrow(df)){
  var_customername <- strsplit(as.character(df$names.1[i]),"\s+")
  var_relationshipname <- strsplit(as.character(df$names.2[i]),"\s+")                                
  df$NAMEMATCH[i] <- ifelse(any(unlist(var_customername) %in% unlist(var_relationshipname)),'YES','NO')
  rm(var_customername,var_relationshipname)
}

我的整个数据框是 700 万行,因此根据我的计算,由于 if any 循环,它需要 405 小时 - 关于如何更快或优化它的任何建议?

我在这里使用 'apply':

展示了一种更快的方法

你的方法:

> start.time <- Sys.time()
> for(i in 1:nrow(df)){
+   var_customername <- strsplit(as.character(df$names.1[i]),"\s+")
+   var_relationshipname <- strsplit(as.character(df$names.2[i]),"\s+")                                

+   df$NAMEMATCH[i] <- ifelse(any(unlist(var_customername) %in% 
unlist(var_relationshipname)),'YES','NO')
+   rm(var_customername,var_relationshipname)
+ }
> end.time <- Sys.time()
> time.taken <- end.time - start.time
> time.taken
Time difference of 0.03119993 secs

我的方法:

> start.time <- Sys.time()
> apply(df, 1, function(x) 
ifelse(any(unlist(strsplit(as.character(x[1]),"\s+")) %in% 
unlist(strsplit(as.character(x[2]),"\s+"))),'YES','NO'))
[1] "YES" "NO"  "YES" "YES"
> end.time <- Sys.time()
> time.taken <- end.time - start.time
> time.taken
Time difference of 0 secs