группировка двух кадров данных и зацикливание с помощью stringdist_join

Я хочу провести нечеткое сопоставление американских округов по десятилетиям, используя stringdist_join. Поскольку названия округов меняются с течением времени, я хочу, чтобы каждое десятилетие соответствовало правильному названию округа.

Если я напишу:

stringdist_join(mispelled,correct,by=c('decade','county'))

Затем stringdist_join также будет выполнять нечеткое сопоставление по десятилетию, например, сопоставление С 1960 по 1970 год, когда на самом деле я хочу рассматривать переменную десятилетия как правильную и только нечеткое соответствие округам.

Я вижу, что мне нужно сгруппировать неверно написанные и исправленные фреймы данных по десятилетиям, а затем запустить каждый отдельно, но я не знаю, как это сделать. Решения Tidyverse будут предпочтительнее.

Спасибо!


person John Clegg    schedule 06.01.2021    source источник


Ответы (1)


В конечном счете, я думаю, что метод, который вы ищете, - это позволить max_dist быть вектором расстояний, где вы могли бы сделать stringdist_inner_join(..., max_dist=c(0,2)). К сожалению, хотя это было запрошено (в 2017 году: https://github.com/dgrtwo/fuzzyjoin/issues/36 и https://github.com/dgrtwo/fuzzyjoin/issues/21), но пока не реализован.

Обходной путь, если вы можете позволить себе более крупный промежуточный продукт соединения, состоит в том, чтобы разрешить его, а затем отфильтровать, где decade - неточное соединение.

Не имея данных, я продемонстрирую использование ggplot2::diamonds. Здесь мне нужны нормальные stringdist функции для cut и точные совпадения для clarity.

d <- data.frame(cut = c("Idea", "Premiums", "Premioom", "VeryGood", "VeryGood", "Faiir"),
                clarity = rep(c("SI1", "SI2"),3),
                type = 1:6)
data("diamonds", package = "ggplot2")
diamonds <- diamonds[1:10,]

joined <- stringdist_inner_join(diamonds, d, by = c("cut", "clarity"))
joined
# # A tibble: 8 x 13
#   carat cut.x     color clarity.x depth table price     x     y     z cut.y    clarity.y  type
#   <dbl> <ord>     <ord> <ord>     <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>    <chr>     <int>
# 1 0.23  Ideal     E     SI2        61.5    55   326  3.95  3.98  2.43 Idea     SI1           1
# 2 0.21  Premium   E     SI1        59.8    61   326  3.89  3.84  2.31 Premiums SI2           2
# 3 0.21  Premium   E     SI1        59.8    61   326  3.89  3.84  2.31 Premioom SI1           3
# 4 0.290 Premium   I     VS2        62.4    58   334  4.2   4.23  2.63 Premiums SI2           2
# 5 0.26  Very Good H     SI1        61.9    55   337  4.07  4.11  2.53 VeryGood SI2           4
# 6 0.26  Very Good H     SI1        61.9    55   337  4.07  4.11  2.53 VeryGood SI1           5
# 7 0.22  Fair      E     VS2        65.1    61   337  3.87  3.78  2.49 Faiir    SI2           6
# 8 0.23  Very Good H     VS1        59.4    61   338  4     4.05  2.39 VeryGood SI1           5

subset(joined, clarity.x == clarity.y)
# # A tibble: 2 x 13
#   carat cut.x     color clarity.x depth table price     x     y     z cut.y    clarity.y  type
#   <dbl> <ord>     <ord> <ord>     <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>    <chr>     <int>
# 1  0.21 Premium   E     SI1        59.8    61   326  3.89  3.84  2.31 Premioom SI1           3
# 2  0.26 Very Good H     SI1        61.9    55   337  4.07  4.11  2.53 VeryGood SI1           5
person r2evans    schedule 06.01.2021
comment
Спасибо, вы знаете, как это можно адаптировать к left_join, чтобы не пропустить недостающие случаи ясности.y? - person John Clegg; 06.01.2021