提问人:droseraCapensis 提问时间:5/30/2023 最后编辑:droseraCapensis 更新时间:5/31/2023 访问量:87
R 中具有条件“模糊”字符串匹配的表联接
Table joins with conditional "fuzzy" string matching in R
问:
我正在尝试连接两个表格,一个是较小的表格,其中包含一列常见食物的名称(例如“玉米”、“辣椒”、“南瓜”......等等),另一个是带有特定食物名称的较大表格(例如“甜玉米”、“红玉米”、“小玉米”、“西葫芦南瓜”、“橙南瓜”、“南瓜,大”......等等......我正在尝试根据“模糊”条件进行联接,在该条件中,我指定联接食物名称,并将较大表的另一列(模式)中最常见的代码拉入较小表中的新列。
下面是一个较小表的示例:
食物名称 | 食品法典 |
---|---|
玉米 | 那 |
南瓜 | 那 |
辣椒 | 那 |
下面是较大表的示例:
食物名称 | 食品法典 |
---|---|
甜玉米 | 532 |
红玉米 | 532 |
小鸡眼 | 944 |
南瓜 | 111 |
长壁球 | 123 |
红辣椒 | 654 |
青椒 | 655 |
红辣椒 | 654 |
我已经尝试了 dplyr 包中的“left_join”函数,但这似乎不适用于“模糊”字符串连接功能。我知道 tidyverse 也有一个查找分组变量模式的函数,我希望使用该函数,但我不确定如何将其合并到 left_join 语句中。我还发现了 R 中的 fuzzyjoin 包,但我不确定这是否是最佳选择。
我想要的输出如下所示:
食物名称 | 食品法典 |
---|---|
玉米 | 532 |
南瓜 | 111 |
辣椒 | 654 |
答:
0赞
Pablo Bernabeu
5/31/2023
#1
我希望这对你有所帮助。
在 中,参数用于约束模糊度。stringdist_join
max_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 行)。在其他方面完美无缺
评论