如何用R检查字符串是否含参考向量中达标长度的连续字符
需求实现
给定字符向量和最小阈值:
ref_vector <- c("R", "H", "K") min_thres <- 5
需要实现:检查输入字符串是否包含仅由ref_vector中字符组成的连续子序列,且该子序列长度≥min_thres。
示例说明
以下是测试字符串及对应结果:
x1 <- "GMRRRRRRRS" # 结果:TRUE # ***** # ***** # ***** x2 <- "GKRKRRHRRS" # 结果:TRUE # ***** # ***** # ***** # ***** x3 <- "GKRKARHQRS" # 结果:FALSE # *** ** *
输入字符串、ref_vector的内容和长度均可动态变化,如何用R实现该功能?
解决方案
方法1:正则表达式匹配
将ref_vector中的字符拼接成正则字符类,直接匹配连续出现≥指定长度的目标字符序列:
check_seq <- function(x, ref_vec, min_len) { # 构造匹配规则:连续出现min_len次及以上的ref_vec字符 pattern <- paste0("[", paste(ref_vec, collapse = ""), "]{", min_len, ",}") # 检查字符串是否存在匹配 grepl(pattern, x) } # 测试示例 check_seq(x1, ref_vector, min_thres) # TRUE check_seq(x2, ref_vector, min_thres) # TRUE check_seq(x3, ref_vector, min_thres) # FALSE
方法2:拆分字符后计算连续匹配长度
拆分字符串为单个字符,通过游程编码计算连续符合条件的字符长度,判断是否存在达标段:
check_seq <- function(x, ref_vec, min_len) { # 拆分字符串为单个字符向量 chars <- strsplit(x, "")[[1]] # 标记每个字符是否属于目标集合 is_match <- chars %in% ref_vec # 计算连续匹配的游程长度 run_info <- rle(is_match) # 检查是否存在连续匹配且长度达标段 any(run_info$values & run_info$lengths >= min_len) } # 测试示例 check_seq(x1, ref_vector, min_thres) # TRUE check_seq(x2, ref_vector, min_thres) # TRUE check_seq(x3, ref_vector, min_thres) # FALSE
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

