Замените повторяющиеся значения из столбца данных, используя нечеткое совпадение

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

Как и в этом посте, у меня есть один вектор

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

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

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
Другие вопросы по тегам