在R中如何提取dataframe字符串内数字前的大写国家缩写
R实现提取多列字符串中数字前的国家缩写
实现思路
- 先将每行所有列的字符串拼接为一个完整字符串,避免跨列匹配遗漏
- 基于给定的国家缩写列表构造正则匹配规则,捕获数字前最近出现的目标大写国家缩写
- 按行遍历处理后将结果存入新列
完整代码
首先构造示例数据与国家代码向量:
TD <- data.frame( a = c("WHATEVERDE 11111","","Whatever DE 11111","DE 11111",""), b = c("","What DE EverDE 1111","","",""), c = c("Whatever","","","","WhateverDE 11111") ) # 避免和R内置函数names重名,将国家代码向量重命名为country_codes country_codes <- c('AT','BE','DE','BG','CZ','DK','FR','GR','ES','NL','HU','GB','IT')
核心处理逻辑:
# 构造匹配正则:贪婪匹配到数字前最近的目标国家大写缩写 pattern <- paste0(".*(", paste(country_codes, collapse = "|"), ")[^0-9]*\\d.*") # 按行处理提取结果 TD$result <- apply(TD, 1, function(row) { row_total <- paste(row, collapse = " ") ifelse(grepl(pattern, row_total), sub(pattern, "\\1", row_total), "") })
输出验证
打印处理后的TD即可得到和预期完全一致的结果:
> TD a b c result 1 WHATEVERDE 11111 Whatever DE 2 What DE EverDE 1111 DE 3 Whatever DE 11111 DE 4 DE 11111 DE 5 WhateverDE 11111 DE
正则说明
.*为贪婪匹配,会优先匹配最长的前缀,确保捕获的是数字前最后一个出现的目标国家缩写- 括号
()内为所有目标国家缩写的可选集合 [^0-9]*匹配国家缩写和数字之间所有的非数字字符(包括空格、其他字母等)\\d匹配后续的数字,确保捕获的国家缩写位于数字之前
内容的提问来源于stack exchange,提问作者Zizou
相关产品推荐
相关产品推荐

