字串匹配
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
我有一个包含两列人名的数据框。使用以下代码生成 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