2015-11-02 10 views
1

Я пытаюсь использовать библиотеку ('RecordLinkage') и функцию compare.dedup() для замены повторяющихся значений в одном столбце.Заменить повторяющиеся значения из столбца dataframe с использованием нечеткого соответствия

Подобно этому post, у меня есть один вектор

tv3 = c("TOURDEFRANCE", 'TOURDEFRANCE', "TOURDE FRANCE", "TOURDE FRANZ", "GET FRESH") 

и выход я хочу следующее, основываясь на заданном значении веса (например,> 0,8):

("TOURDEFRANCE", 'TOURDEFRANCE', "TOURDEFRANCE", "TOURDEFRANCE", "GET FRESH") 

Вот код, который я пытался получить в соответствии с данными:

tv3 = as.data.frame(c("TOURDEFRANCE", 'TOURDEFRANCE', "TOURDE FRANCE", 
        "TOURDE FRANZ", "GET FRESH")) 
colnames(tv3) <- "name" 
tv3 %>% compare.dedup(strcmp = TRUE) %>% 
    epiWeights() %>% 
    epiClassify(0.8) %>% 
    getPairs(show = "links", single.rows = TRUE) -> matches 

Однако, чтобы получить то, что мне нужно, я использовал t он ниже петли:

matches <- matches[order(matches$id1),] 
tv3new <- tv3 
for (i in 1:nrow(matches)) { 
    tv3new[tv3new$name==matches[i,'name.2'],] <- matches[i,'name.1'] 
} 
tv3new 

Это дает мне то, что я хочу, но интересно, если с помощью цикла является лучшим способом сделать это, или если я что-то очевидное отсутствует.

ответ

1

Без цикла:

tv3new <- c(as.character(matches[tv3$name %in% matches$name.2*1, 2]), 
      as.character(tv3[!tv3$name %in% matches$name.2, ])) 
# If we need a data frame 
data.frame(name = tv3new) 

Выход:

  name 
1 TOURDEFRANCE 
2 TOURDEFRANCE 
3 TOURDEFRANCE 
4 TOURDEFRANCE 
5 GET FRESH