Нечеткое объединение нескольких переменных (все, кроме одной, без ошибок) - PullRequest
1 голос
/ 20 марта 2019

Мне нужно сопоставить два набора данных по трем переменным. Две из трех переменных не содержат орфографических ошибок (по замыслу). Нечеткое совпадение требуется только для третьей переменной.

Стандартный fuyyzmerge генерирует некоторые проблемы путём нечеткого соединения всех трех переменных.

Есть ли способ указать, какой из трех должен быть нечетким, а какой - точным?

Воспроизводимый пример:

dataset_1 <- setNames(data.frame(c(1995,1996,1995,1996),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBB")), c("var_1", "var_2", "var_3"))
dataset_2 <- setNames(data.frame(c(1995,1996,1995,1996),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBC"),c("A","B","C","D")), c("var_1", "var_2", "var_3","var_4"))


merged <- stringdist_join(dataset_1, dataset_2, 
                                  by=c("var_1","var_2","var_3"),  
                                  max_dist = 2, 
                                  method = c("soundex"),
                                  mode = "full", 
                                  ignore_case = FALSE)

Идеальный результат:

merged <- setNames(data.frame(rep(1995,4),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBB"),c("A","B","C","D")), c("var_1", "var_2", "var_3","var_4"))

1 Ответ

0 голосов
/ 20 марта 2019

stringdist_join является оберткой вокруг fuzzy_join, а fuzzy_join имеет аргумент match_fun, который может быть либо уникальной функцией, либо списком функций, если ваш аргумент by, поэтому мы можем использовать fuzzy_full_join (то есть fuzzy_join с mode= "full"):

library(fuzzyjoin)
res <- fuzzy_full_join(dataset_1, dataset_2, 
                by=c("var_1","var_2","var_3"),
                list(`==`, `==`, function(x,y) stringdist::stringdist(x,y, "soundex") <= 2))
res
#   var_1.x var_2.x var_3.x var_1.y var_2.y var_3.y var_4
# 1    1995      AA    AAAA    1995      AA    AAAA     A
# 2    1996      AA    AAAA    1996      AA    AAAA     B
# 3    1995      BB    BBBB    1995      BB    BBBB     C
# 4    1996      BB    BBBB    1996      BB    BBBC     D

Из-за природы нечеткого сопоставления значения обычно не одинаковы для lhs и rhs, поэтому мы получаем два набора столбцов by, если вы хотите сохранить только те lhs, которые мы можем сделать:

library(dplyr)
res %>% 
  select(-ends_with(".y")) %>%
  rename_all(~sub("\\.x$","",.))

#   var_1 var_2 var_3 var_4
# 1  1995    AA  AAAA     A
# 2  1996    AA  AAAA     B
# 3  1995    BB  BBBB     C
# 4  1996    BB  BBBB     D
...