在R语言中移除向量字符串的共同起始匹配模式
移除字符串向量的共同起始前缀
我有若干存储于向量中的字符串,需要移除这些字符串的共同起始匹配模式,但不清楚该模式的具体内容与长度。示例向量如下:
stringa <- c("apple_tart", "apple_pie", "apple_fritter") stringb <- c("baby breath", "baby oil", "baby doll", "baby name")
期望得到的结果为:
resultsa <- c("tart", "pie", "fritter") resultsb <- c("breath", "oil", "doll", "name")
已知明确模式或长度时可使用str_remove实现需求,请问是否有办法先定位该起始模式再借助str_remove完成操作?
解决方案
方法一:使用stringr包快速实现
stringr包提供的str_common_prefix()函数可直接提取向量中所有字符串的最长共同起始前缀,再结合str_remove()移除前缀及后续的分隔符(如下划线、空格等):
- 加载
stringr包:
library(stringr)
- 处理
stringa向量:
# 获取最长共同前缀 common_prefix_a <- str_common_prefix(stringa) # 移除前缀及后续的非单词分隔符(正则^匹配字符串开头) resultsa <- str_remove(stringa, paste0("^", common_prefix_a, "\\W"))
- 处理
stringb向量:
common_prefix_b <- str_common_prefix(stringb) resultsb <- str_remove(stringb, paste0("^", common_prefix_b, "\\W"))
执行后即可得到目标结果。
方法二:Base R实现(无需额外包)
如果不想依赖第三方包,可以自行编写函数提取共同前缀,再用gsub()完成移除:
- 编写提取共同前缀的函数:
get_common_prefix <- function(str_vec) { if (length(str_vec) == 1) return(str_vec) # 将每个字符串拆分为单个字符 split_chars <- strsplit(str_vec, "") # 取最短字符串长度作为遍历上限 min_length <- min(sapply(split_chars, length)) # 找出所有位置上字符完全相同的索引 same_chars <- sapply(1:min_length, function(i) { all(sapply(split_chars, function(x) x[i] == split_chars[[1]][i])) }) # 拼接共同前缀 if (any(same_chars)) { paste(split_chars[[1]][same_chars], collapse = "") } else { "" } }
- 处理目标向量:
# 处理stringa prefix_a <- get_common_prefix(stringa) resultsa <- gsub(paste0("^", prefix_a, "\\W"), "", stringa) # 处理stringb prefix_b <- get_common_prefix(stringb) resultsb <- gsub(paste0("^", prefix_b, "\\W"), "", stringb)
内容的提问来源于stack exchange,提问作者Katie Helm
相关产品推荐
相关产品推荐

