R语言优化:从水质样本站点描述中提取水体名称
水体名称提取优化方案
问题分析
原代码存在两个核心缺陷:
- 正则仅匹配单个前置单词,无法覆盖多词组成的水体名称(如
RED ROBIN CREEK); - 对缩写
R的匹配规则不合理(原代码用带前后空格的" R ",且未匹配FORDING R这类仅单个空格分隔的场景)。
优化后代码实现
library(stringr) wbod_data<- data.frame(smpl_ID = c(1, 2, 3, 4, 5), site_loc = c("Nile River at bridge", "MC-M1", "Red ROBIN CREEK 30 M D_S OF STP", "PT068 SCUTTLE LK #2", "FORDING R BELOW HARE CREEK"), waterbody = c(NA, NA, NA, NA, NA)) # 定义水体类型关键词,包含全称和缩写 water_types <- c("River", "R", "CREEK", "LK") # 构建正则模式:匹配1个或多个前置单词,后跟水体类型,忽略大小写 pattern <- paste0("(?i)(\\w+\\s+)*(", paste(water_types, collapse = "|"), ")\\b") # 提取并清理结果 wbod_data$waterbody <- str_extract(wbod_data$site_loc, pattern) wbod_data$waterbody <- str_trim(wbod_data$waterbody) print(wbod_data$waterbody)
关键优化点说明
- 多词名称适配:
(\\w+\\s+)*匹配0个或多个“单词+空格”组合,支持提取RED ROBIN CREEK这类多词组成的水体名称。 - 缩写
R处理:将R加入关键词列表,用\\b确保匹配独立的R(避免误匹配其他单词中的字母),(?i)启用大小写不敏感,兼容不同格式的写法。 - 空格清理:
str_trim()去除提取结果前后的冗余空格,保证输出格式整洁。
运行结果
[1] "Nile River" NA "Red ROBIN CREEK" "SCUTTLE LK" "FORDING R"
扩展处理(多水体提及场景)
如果一行中存在多个水体名称(如FORDING R BELOW HARE CREEK),需要提取所有匹配项时,可替换为str_extract_all:
wbod_data$waterbody_all <- str_extract_all(wbod_data$site_loc, pattern)
内容的提问来源于stack exchange,提问作者Christopher Rudolph
相关产品推荐
相关产品推荐

