在R中基于模糊字符串匹配连接表并填充众数编码
R实现模糊匹配连接并填充众数编码
步骤1:准备示例数据
先把示例数据转换成R可处理的数据结构:
library(tidyverse) library(fuzzyjoin) # 小表(通用食品名) small_df <- tibble( Food_Name = c("Corn", "Squash", "Peppers"), Food_Code = NA_integer_ ) # 大表(具体食品名+对应编码) large_df <- tibble( 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) )
步骤2:定义众数计算函数
R没有内置众数函数,自定义一个用于提取分组内出现次数最多的编码(若多个编码出现次数相同,取第一个出现的众数):
get_mode <- function(x) { unique_vals <- unique(x) unique_vals[which.max(tabulate(match(x, unique_vals)))] }
步骤3:模糊连接+众数填充
用regex_left_join实现通用名与具体名的模糊匹配,再分组计算编码众数,最后整理成期望格式:
result <- small_df %>% # 模糊匹配:小表食品名匹配大表中包含该字符串的记录 regex_left_join(large_df, by = "Food_Name", ignore_case = TRUE) %>% # 按小表原始食品名分组 group_by(Food_Name.x) %>% # 提取分组内编码的众数 summarise(Food_Code = get_mode(Food_Code.y)) %>% # 重命名列名匹配输出要求 rename(Food_Name = Food_Name.x) print(result)
运行后输出结果:
# A tibble: 3 × 2 Food_Name Food_Code <chr> <dbl> 1 Corn 532 2 Peppers 654 3 Squash 111
方案说明
- 选择
fuzzyjoin的原因:dplyr::left_join仅支持精确匹配,无法处理通用名与具体名的关联需求;fuzzyjoin的regex_left_join可通过正则实现包含式模糊匹配,完全适配场景。 - 众数逻辑可调整:如果需要处理多众数场景,可修改
get_mode函数,比如返回所有众数或按规则筛选。
内容的提问来源于stack exchange,提问作者droseraCapensis
相关产品推荐
相关产品推荐

