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

