2015-07-29 2 views
1

Я ищу несколько советов о лучшей переработанной реализации цели ниже MWE, которая эффективно проверяет каждый элемент в списке по отношению к каждому элементу в другом списке, используя agrep ; этот пример равен 2x2, но моя фактическая проблема - это что-то вроде 2,500x75,000, поэтому любые советы по распараллеливанию также могут быть полезны.Нечеткое сопоставление между двумя списками - улучшающая двойная петля для эффективности

text<-c("The quack brown fox jumps over a lazy dog.", "Pack my box with five dozzen liquor jugs.") 
texts<-data.frame(text, stringsAsFactors = FALSE) 

words<-c("quick","dozen") 
search<-data.frame(words, stringsAsFactors = FALSE) 

texts$match<-"" 
for (i in 1:nrow(search)) { 
    print(i) 
    for (j in 1:nrow(texts)) { 
    print(j) 
    temp<- agrep(search$words[i], texts$text[j], max.distance = 0.1, costs = NULL, 
        ignore.case = TRUE, value = TRUE, fixed = TRUE, 
        useBytes = FALSE) 
    # print(temp) 
    if (!((length(temp) == 0) && (typeof(temp) == "character"))) { 
     texts$match[j]<-paste0(texts$match[j], search$words[i],';') 
    } 
    rm(temp) 
    } 
} 
texts 
             text match 
1 The quack brown fox jumps over a lazy dog. quick; 
2 Pack my box with five dozzen liquor jugs. dozen; 

ответ

0

Вы можете по крайней мере отказаться от второго цикла, используя вектор во втором аргументе agrep.

text<-c("The quack brown fox jumps over a lazy dog.", "Pack my box with five dozzen liquor jugs.") 
texts<-data.frame(text, stringsAsFactors = FALSE) 

words<-c("quick","dozen") 
search<-data.frame(words, stringsAsFactors = FALSE) 

texts$matchs <- "" 
for (i in 1:nrow(search)) { # i <- 1 
    print(i) 
    temp<- agrepl(search$words[i], texts$text, max.distance = 0.1, costs = NULL, 
       ignore.case = TRUE, fixed = TRUE, 
       useBytes = FALSE) 
    # print(temp) 
    if (max(temp) == 1) { 
     texts$matchs[temp] <- paste(texts$matchs[temp], search$words[i], sep = ';') 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^