You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:05:14