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

R dplyr基于字符行条件连接两个数据框的实现问题

实现方案

这里提供两种常用实现方式,均基于tidyverse生态,匹配逻辑为检查df2$c的后缀是否等于df1$a的取值,符合你提到的ends_with类函数的匹配需求。

方案1:使用fuzzyjoin包实现正则左连接(代码最简洁)

library(tidyverse)
library(fuzzyjoin)

df_result <- df2 %>%
  # 匹配规则:c的后缀等于a的取值
  regex_left_join(df1, by = c("c" = "a"), match_fun = stringr::str_ends) %>%
  select(c, new = b)

方案2:仅用tidyverse基础函数实现(无需额外安装包)

如果不想安装额外扩展包,可以用逐行遍历匹配的方式实现:

library(tidyverse)

df_result <- df2 %>%
  mutate(new = map_chr(c, function(x) {
    # 提取所有匹配的b值,多个匹配时默认取第一个,可自行调整优先级
    matched_val <- df1$b[str_ends(x, df1$a)]
    ifelse(length(matched_val) > 0, matched_val[1], NA_character_)
  }))

匹配优先级调整

如果存在长后缀和短后缀同时匹配的场景(比如同时有a="010"和a="10"都匹配某个c的后缀),只需要提前对df1按a的长度降序排序,就可以优先匹配更长的后缀:

df1 <- df1 %>% arrange(desc(nchar(a)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:36:04