将两个数据帧分组并用 stringdist_join 循环
grouping two data frames and looping over with stringdist_join
我想使用 stringdist_join 按十年对美国各县进行模糊匹配。由于县名随时间变化,我想在每个十年中匹配到正确的县名。
如果我写:
stringdist_join(mispelled,correct,by=c('decade','county'))
然后 stringdist_join 也会对十年进行模糊匹配,例如匹配1960 年到 1970 年,实际上我想将 decade 变量视为正确并且只模糊匹配县。
我可以看到我需要按十年对拼写错误和更正的数据帧进行分组,然后 运行 分别对每个数据帧进行分组,但我不知道该怎么做。首选 Tidyverse 解决方案。
谢谢!
最终,我认为您寻求的方法是让 max_dist
成为距离向量,您可能会这样做 stringdist_inner_join(..., max_dist=c(0,2))
。不幸的是,虽然已提出要求(2017 年:https://github.com/dgrtwo/fuzzyjoin/issues/36 and https://github.com/dgrtwo/fuzzyjoin/issues/21),但似乎尚未实施。
如果您能负担得起更大的中间连接产品,一个解决方法是允许它,然后过滤掉 decade
不精确连接的地方。
缺少数据,我将使用 ggplot2::diamonds
进行演示。在这里,我想要 cut
的正常 stringdist
功能和 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
我想使用 stringdist_join 按十年对美国各县进行模糊匹配。由于县名随时间变化,我想在每个十年中匹配到正确的县名。
如果我写:
stringdist_join(mispelled,correct,by=c('decade','county'))
然后 stringdist_join 也会对十年进行模糊匹配,例如匹配1960 年到 1970 年,实际上我想将 decade 变量视为正确并且只模糊匹配县。
我可以看到我需要按十年对拼写错误和更正的数据帧进行分组,然后 运行 分别对每个数据帧进行分组,但我不知道该怎么做。首选 Tidyverse 解决方案。
谢谢!
最终,我认为您寻求的方法是让 max_dist
成为距离向量,您可能会这样做 stringdist_inner_join(..., max_dist=c(0,2))
。不幸的是,虽然已提出要求(2017 年:https://github.com/dgrtwo/fuzzyjoin/issues/36 and https://github.com/dgrtwo/fuzzyjoin/issues/21),但似乎尚未实施。
如果您能负担得起更大的中间连接产品,一个解决方法是允许它,然后过滤掉 decade
不精确连接的地方。
缺少数据,我将使用 ggplot2::diamonds
进行演示。在这里,我想要 cut
的正常 stringdist
功能和 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