R语言中如何基于正则表达式比对两个字符向量筛选匹配相同模式的条目
R语言按共同字符模式匹配两个文件名向量的实现
现有提取代码的后续匹配逻辑
你已经完成了ISO编码提取,之前直接用setdiff(a,b)比较完整文件名的逻辑无效——两个向量的文件名前缀、后缀结构完全不同,无重叠条目。只需通过共有ISO编码集合反向匹配原始向量即可:
# 你已实现的ISO提取代码 a_ISO <- str_sub(a, start = 10, end = -5) b_ISO <- str_sub(b, start = 12, end = -9) # 1. 计算两个向量共有的ISO编码 common_iso <- intersect(a_ISO, b_ISO) # 2. 按共有ISO筛选原始向量 result_a <- a[a_ISO %in% common_iso] result_b <- b[b_ISO %in% common_iso]
运行后输出完全匹配示例期望。
基于正则的鲁棒性实现(无需手动指定截取位置)
如果后续文件名前缀长度变动,手动指定str_sub的起止位置会失效,直接用正则匹配ISO模式更通用。示例中ISO为3位大写英文字母,用stringr包实现:
# 未安装包先运行 install.packages("stringr") library(stringr) # 提取所有文件名中匹配的3位大写英文字母(即ISO编码) a_ISO_regex <- str_extract(a, "[A-Z]{3}") b_ISO_regex <- str_extract(b, "[A-Z]{3}") # 后续筛选逻辑和上述一致 common_iso <- intersect(a_ISO_regex, b_ISO_regex) result_a <- a[a_ISO_regex %in% common_iso] result_b <- b[b_ISO_regex %in% common_iso]
若文件名中存在其他大写字母片段,可用更精准的位置限定正则避免误匹配:
- 匹配a向量格式
nutr_sup_<ISO>.csv,提取下划线和.csv之间的ISO:a_ISO_regex <- str_match(a, "_([A-Z]{3})\\.csv$")[, 2] - 匹配b向量格式
nutr_needs_<ISO>_pop.csv,提取下划线和_pop之间的ISO:b_ISO_regex <- str_match(b, "_([A-Z]{3})_pop\\.csv$")[, 2]
可选:严格按ISO编码对齐顺序输出
上述方法的输出顺序会和原始向量的条目顺序一致,若需要按ISO编码排序对齐两个结果向量,可用数据框合并实现:
df_a <- data.frame(iso = a_ISO_regex, file = a) df_b <- data.frame(iso = b_ISO_regex, file = b) matched_df <- merge(df_a, df_b, by = "iso") result_a <- matched_df$file.x result_b <- matched_df$file.y
内容的提问来源于stack exchange,提问作者Annika
相关产品推荐
相关产品推荐

