单词字符串匹配

时间:2017-09-21 01:30:09

标签: r string stringr

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

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列的整个字符串中的任何单词匹配,则"是" ,否则"否" - 只要找到匹配就可以给出肯定。

我的代码如下:

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万行,因此我的计算需要405小时,因为if if循环 - 有关如何更快或优化的建议?

1 个答案:

答案 0 :(得分:1)

我在这里使用&#39; apply&#39;:

展示了一种更快捷的方法

您的方法:

> 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
相关问题