R 中具有条件“模糊”字符串匹配的表联接

Table joins with conditional "fuzzy" string matching in R

提问人:droseraCapensis 提问时间:5/30/2023 最后编辑:droseraCapensis 更新时间:5/31/2023 访问量:87

问:

我正在尝试连接两个表格,一个是较小的表格,其中包含一列常见食物的名称(例如“玉米”、“辣椒”、“南瓜”......等等),另一个是带有特定食物名称的较大表格(例如“甜玉米”、“红玉米”、“小玉米”、“西葫芦南瓜”、“橙南瓜”、“南瓜,大”......等等......我正在尝试根据“模糊”条件进行联接,在该条件中,我指定联接食物名称,并将较大表的另一列(模式)中最常见的代码拉入较小表中的新列。

下面是一个较小表的示例:

食物名称 食品法典
玉米
南瓜
辣椒

下面是较大表的示例:

食物名称 食品法典
甜玉米 532
红玉米 532
小鸡眼 944
南瓜 111
长壁球 123
红辣椒 654
青椒 655
红辣椒 654

我已经尝试了 dplyr 包中的“left_join”函数,但这似乎不适用于“模糊”字符串连接功能。我知道 tidyverse 也有一个查找分组变量模式的函数,我希望使用该函数,但我不确定如何将其合并到 left_join 语句中。我还发现了 R 中的 fuzzyjoin 包,但我不确定这是否是最佳选择。

我想要的输出如下所示:

食物名称 食品法典
玉米 532
南瓜 111
辣椒 654
r 字符串 dplyr fuzzyjoin

评论

0赞 Pablo Bernabeu 5/31/2023
如果您包含一个简单的可重现示例,其中包含可用于测试和验证可能的解决方案的示例输入和所需输出,则更容易为您提供帮助。
0赞 Pablo Bernabeu 5/31/2023
这可能会有所帮助:stackoverflow.com/questions/61000838/fuzzy-left-join-with-r

答:

0赞 Pablo Bernabeu 5/31/2023 #1

我希望这对你有所帮助。

在 中,参数用于约束模糊度。stringdist_joinmax_dist

library(fuzzyjoin)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(knitr)


small_tab = data.frame(Food.Name = c('Corn', 'Squash', 'Peppers'), 
                       Food.Code = c(NA, NA, NA))


large_tab = data.frame(Food.Name = c('Sweet Corn', 'Red Corn', 'Baby Corns', 
                                     'Squash', 'Long Squash', 'Red Pepper', 
                                     'Green Pepper', 'Red Peppers'), 
                       Food.Code = c(532, 532, 944, 111, 123, 654, 655, 654))

joined_tab = stringdist_join(small_tab, large_tab, by = 'Food.Name',
                             ignore_case = TRUE, method = 'cosine', 
                             max_dist = 0.5, distance_col = 'dist') %>%
  
  # Tidy columns 
  select(Food.Name = Food.Name.x, -Food.Name.y, 
         Food.Code = Food.Code.y, -dist) %>%
  
  # Only keep most frequent food code per food name
  group_by(Food.Name) %>% count(Food.Name, Food.Code) %>% 
  slice(which.max(n)) %>% select(-n) %>%
  
  # Order food names as in the small table
  arrange(factor(Food.Name, levels = small_tab$Food.Name))

# Show table with columns renamed
joined_tab %>%
  rename('Food Name' = Food.Name, 
         'Food Code' = Food.Code) %>%
  kable()
食物名称 食品法典
玉米 532
南瓜 111
辣椒 654

创建于 2023-05-31,使用 reprex v2.0.2

评论

0赞 droseraCapensis 5/31/2023
非常感谢,这就像一个魅力!由于内存保护问题,我确实不得不将较大的表分解为较小的分组块(实际表为 ~180,000 行)。在其他方面完美无缺