基于相似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
相关产品推荐
相关产品推荐

