我有一个包含两列人物名称的数据框。使用以下代码生成表格:
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循环 - 有关如何更快或优化的建议?
答案 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