R语言如何提取字符串指定模式所有匹配位置并统计匹配次数
R中提取字符串所有模式匹配位置与匹配次数的实现
stringr包的str_locate()函数设计上仅返回每个输入字符串的第一个匹配结果,要获取全部匹配项,直接使用同包的str_locate_all()函数即可,该函数返回与输入向量等长的列表,每个列表元素存储对应字符串所有匹配的起止坐标矩阵,基于这个结果可以一次性实现你需要的两个需求。
完整实现代码
library(stringr) # 测试数据集构造(和提供的生成逻辑一致) set.seed(999) col_list <- lapply(1:10, function(x) sample.int(5, 200, replace = TRUE)) d <- data.frame( id = 1:10, seq = sapply(col_list, paste, collapse = "") ) # 定义匹配模式 pattern <- "11" # 获取所有匹配结果 match_res <- str_locate_all(d$seq, pattern = pattern) # 逐行统计总匹配次数 d$match_total <- sapply(match_res, nrow) # 逐行记录所有匹配的起始位置(这里存为逗号分隔的字符串,需要列表格式直接赋值match_res即可) d$match_positions <- sapply(match_res, function(mat) { if (nrow(mat) == 0) return(NA_character_) paste(mat[, "start"], collapse = ",") })
补充说明
- 返回的
match_res列表中,每个元素为两列矩阵:start列存储对应匹配的起始索引,end列存储对应匹配的结束索引,对于长度为2的模式"11",所有匹配的end值均为start + 1。 - 当对应字符串无匹配项时,矩阵行数为0,此时匹配次数返回0,位置返回NA,符合常规统计逻辑。
- 如果需要识别重叠匹配(例如字符串"111"中,"11"实际存在位置1、位置2两个重叠匹配,
str_locate_all默认仅返回位置1的非重叠匹配),可以通过滑动窗口逻辑自定义实现:
# 重叠匹配统计函数 overlap_match <- function(s, pat) { s_len <- nchar(s) pat_len <- nchar(pat) if (s_len < pat_len) return(data.frame(start = integer(0), end = integer(0))) all_start <- seq(1, s_len - pat_len + 1) is_match <- sapply(all_start, function(i) substr(s, i, i + pat_len - 1) == pat) data.frame(start = all_start[is_match], end = all_start[is_match] + pat_len - 1) } # 批量计算重叠匹配结果 overlap_res <- lapply(d$seq, overlap_match, pat = pattern) d$overlap_match_total <- sapply(overlap_res, nrow) d$overlap_match_pos <- sapply(overlap_res, function(mat) { if (nrow(mat) == 0) return(NA_character_) paste(mat$start, collapse = ",") })
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

