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

基于相似Flower字段匹配df1与df2并关联Size值的R语言求助

基于关键词模糊匹配关联两个数据框的方法

你需要将df2中Flower字段包含df1中Flower关键词的记录,关联df1对应的Size值,以下提供几种高效实现方案,替代循环写法:

准备工作

先安装并加载所需工具包:

install.packages(c("tidyverse", "fuzzyjoin"))
library(tidyverse)
library(fuzzyjoin)

方法一:使用dplyr + stringr(tidyverse生态)

通过逐行匹配关键词并关联对应Size:

df_result1 <- df2 %>%
  rowwise() %>%
  mutate(
    # 筛选当前Flower匹配的df1关键词
    matched_keyword = df1$Flower[str_detect(Flower, df1$Flower)],
    # 提取对应的Size值
    Size = df1$Size[str_detect(Flower, df1$Flower)]
  ) %>%
  ungroup() # 取消行分组,恢复数据框默认状态

# 查看结果
df_result1

关键步骤说明:

  • rowwise()让数据框按行独立处理后续逻辑
  • str_detect(Flower, df1$Flower)检查当前行的Flower是否包含df1中的每个关键词,返回逻辑向量用于筛选匹配项
  • 由于你的数据中每个df2的Flower仅匹配一个df1关键词,可直接提取对应位置的Size

方法二:使用fuzzyjoin包(简洁的模糊匹配)

fuzzyjoin专门处理非精确匹配的表关联,代码更简洁:

df_result2 <- fuzzy_left_join(
  df2,
  df1,
  by = "Flower",
  match_fun = function(x, y) str_detect(x, y) # 定义匹配逻辑:df2的Flower包含df1的Flower
) %>%
  rename(Flower = Flower.x, Keyword = Flower.y) %>% # 重命名重复字段
  select(Area, Flower, Keyword, Size) # 调整列顺序

# 查看结果
df_result2

关键步骤说明:

  • fuzzy_left_join保留df2所有行,匹配到df1的行自动关联Size,未匹配行Size为NA(你的数据中所有行均可匹配)
  • match_fun自定义匹配规则,这里用str_detect实现包含关系匹配

参考:你原本考虑的循环写法(不推荐)

循环写法虽能实现,但数据量大时效率极低,仅作参考:

# 初始化Size列
df2$Size <- NA

# 遍历df1的每个关键词
for (i in 1:nrow(df1)) {
  keyword <- df1$Flower[i]
  size_val <- df1$Size[i]
  # 为df2中包含该关键词的行赋值Size
  df2$Size[str_detect(df2$Flower, keyword)] <- size_val
}

# 查看结果
df2

最终结果

三种方法得到的结果一致:

Area           Flower Keyword Size
1   CA         Red Rose    Rose   10
2   TX  Yellow Sunflower Sunflower   15
3   NY     Purple Tulip    Tulip   20
4   NV             Rose    Rose   10
5   MD             Rose    Rose   10
6   GA     Yellow Tulip    Tulip   20

内容的提问来源于stack exchange,提问作者shollaback

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:22:33